{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 10 – Introduction to Artificial Neural Networks with Keras**\n",
    "\n",
    "_This notebook contains all the sample code and solutions to the exercises in chapter 10._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/ageron/handson-ml2/blob/master/10_neural_nets_with_keras.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20 and TensorFlow ≥2.0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Python ≥3.5 is required\n",
    "import sys\n",
    "assert sys.version_info >= (3, 5)\n",
    "\n",
    "# Scikit-Learn ≥0.20 is required\n",
    "import sklearn\n",
    "assert sklearn.__version__ >= \"0.20\"\n",
    "\n",
    "try:\n",
    "    # %tensorflow_version only exists in Colab.\n",
    "    %tensorflow_version 2.x\n",
    "except Exception:\n",
    "    pass\n",
    "\n",
    "# TensorFlow ≥2.0 is required\n",
    "import tensorflow as tf\n",
    "assert tf.__version__ >= \"2.0\"\n",
    "\n",
    "# Common imports\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "mpl.rc('axes', labelsize=14)\n",
    "mpl.rc('xtick', labelsize=12)\n",
    "mpl.rc('ytick', labelsize=12)\n",
    "\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"ann\"\n",
    "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n",
    "os.makedirs(IMAGES_PATH, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)\n",
    "\n",
    "# Ignore useless warnings (see SciPy issue #5998)\n",
    "import warnings\n",
    "warnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Perceptrons"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**: we set `max_iter` and `tol` explicitly to avoid warnings about the fact that their default value will change in future versions of Scikit-Learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.linear_model import Perceptron\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data[:, (2, 3)]  # petal length, petal width\n",
    "y = (iris.target == 0).astype(np.int)\n",
    "\n",
    "per_clf = Perceptron(max_iter=1000, tol=1e-3, random_state=42)\n",
    "per_clf.fit(X, y)\n",
    "\n",
    "y_pred = per_clf.predict([[2, 0.5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure perceptron_iris_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "a = -per_clf.coef_[0][0] / per_clf.coef_[0][1]\n",
    "b = -per_clf.intercept_ / per_clf.coef_[0][1]\n",
    "\n",
    "axes = [0, 5, 0, 2]\n",
    "\n",
    "x0, x1 = np.meshgrid(\n",
    "        np.linspace(axes[0], axes[1], 500).reshape(-1, 1),\n",
    "        np.linspace(axes[2], axes[3], 200).reshape(-1, 1),\n",
    "    )\n",
    "X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "y_predict = per_clf.predict(X_new)\n",
    "zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plt.plot(X[y==0, 0], X[y==0, 1], \"bs\", label=\"Not Iris-Setosa\")\n",
    "plt.plot(X[y==1, 0], X[y==1, 1], \"yo\", label=\"Iris-Setosa\")\n",
    "\n",
    "plt.plot([axes[0], axes[1]], [a * axes[0] + b, a * axes[1] + b], \"k-\", linewidth=3)\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#9898ff', '#fafab0'])\n",
    "\n",
    "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n",
    "plt.xlabel(\"Petal length\", fontsize=14)\n",
    "plt.ylabel(\"Petal width\", fontsize=14)\n",
    "plt.legend(loc=\"lower right\", fontsize=14)\n",
    "plt.axis(axes)\n",
    "\n",
    "save_fig(\"perceptron_iris_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Activation functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))\n",
    "\n",
    "def relu(z):\n",
    "    return np.maximum(0, z)\n",
    "\n",
    "def derivative(f, z, eps=0.000001):\n",
    "    return (f(z + eps) - f(z - eps))/(2 * eps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure activation_functions_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 792x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "z = np.linspace(-5, 5, 200)\n",
    "\n",
    "plt.figure(figsize=(11,4))\n",
    "\n",
    "plt.subplot(121)\n",
    "plt.plot(z, np.sign(z), \"r-\", linewidth=1, label=\"Step\")\n",
    "plt.plot(z, sigmoid(z), \"g--\", linewidth=2, label=\"Sigmoid\")\n",
    "plt.plot(z, np.tanh(z), \"b-\", linewidth=2, label=\"Tanh\")\n",
    "plt.plot(z, relu(z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
    "plt.grid(True)\n",
    "plt.legend(loc=\"center right\", fontsize=14)\n",
    "plt.title(\"Activation functions\", fontsize=14)\n",
    "plt.axis([-5, 5, -1.2, 1.2])\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.plot(z, derivative(np.sign, z), \"r-\", linewidth=1, label=\"Step\")\n",
    "plt.plot(0, 0, \"ro\", markersize=5)\n",
    "plt.plot(0, 0, \"rx\", markersize=10)\n",
    "plt.plot(z, derivative(sigmoid, z), \"g--\", linewidth=2, label=\"Sigmoid\")\n",
    "plt.plot(z, derivative(np.tanh, z), \"b-\", linewidth=2, label=\"Tanh\")\n",
    "plt.plot(z, derivative(relu, z), \"m-.\", linewidth=2, label=\"ReLU\")\n",
    "plt.grid(True)\n",
    "#plt.legend(loc=\"center right\", fontsize=14)\n",
    "plt.title(\"Derivatives\", fontsize=14)\n",
    "plt.axis([-5, 5, -0.2, 1.2])\n",
    "\n",
    "save_fig(\"activation_functions_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def heaviside(z):\n",
    "    return (z >= 0).astype(z.dtype)\n",
    "\n",
    "def mlp_xor(x1, x2, activation=heaviside):\n",
    "    return activation(-activation(x1 + x2 - 1.5) + activation(x1 + x2 - 0.5) - 0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x1s = np.linspace(-0.2, 1.2, 100)\n",
    "x2s = np.linspace(-0.2, 1.2, 100)\n",
    "x1, x2 = np.meshgrid(x1s, x2s)\n",
    "\n",
    "z1 = mlp_xor(x1, x2, activation=heaviside)\n",
    "z2 = mlp_xor(x1, x2, activation=sigmoid)\n",
    "\n",
    "plt.figure(figsize=(10,4))\n",
    "\n",
    "plt.subplot(121)\n",
    "plt.contourf(x1, x2, z1)\n",
    "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
    "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
    "plt.title(\"Activation function: heaviside\", fontsize=14)\n",
    "plt.grid(True)\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.contourf(x1, x2, z2)\n",
    "plt.plot([0, 1], [0, 1], \"gs\", markersize=20)\n",
    "plt.plot([0, 1], [1, 0], \"y^\", markersize=20)\n",
    "plt.title(\"Activation function: sigmoid\", fontsize=14)\n",
    "plt.grid(True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building an Image Classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First let's import TensorFlow and Keras."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.1.0'"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.4-tf'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start by loading the fashion MNIST dataset. Keras has a number of functions to load popular datasets in `keras.datasets`. The dataset is already split for you between a training set and a test set, but it can be useful to split the training set further to have a validation set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The training set contains 60,000 grayscale images, each 28x28 pixels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each pixel intensity is represented as a byte (0 to 255):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('uint8')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n",
    "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n",
    "X_test = X_test / 255."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n",
    " color map:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(X_train[0], cmap=\"binary\")\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The labels are the class IDs (represented as uint8), from 0 to 9:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4, 0, 7, ..., 3, 0, 5], dtype=uint8)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are the corresponding class names:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "class_names = [\"T-shirt/top\", \"Trouser\", \"Pullover\", \"Dress\", \"Coat\",\n",
    "               \"Sandal\", \"Shirt\", \"Sneaker\", \"Bag\", \"Ankle boot\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So the first image in the training set is a coat:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Coat'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_names[y_train[0]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The validation set contains 5,000 images, and the test set contains 10,000 images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 28, 28)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 28, 28)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at a sample of the images in the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure fashion_mnist_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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BQUF3r4II3d6l7nqmufqC5mLPHVdmGaqiFJJSUnO411uwxbfISIiIiIiIiIiIiKPkXcMb1j4Wt7BHnvsAbi96LWrj/JitIjAGOPZ35DNzSxLphys+vp6n8+mDQ0qKyu9t57PDG+4sC9zNzV5Q21tbVmsYEtLS1ZelXJx6uvrvdzCjS2EXB58RERExECDciw11oUb02TOI0VFRf4zjandwUT1BXKN7ZMnT06bYyHFXoZscBhR1ByUuciooKAg6zvyvVzbqaeeCqQ2i2hsbPRsrMqMiaWtra315QFlW1RUVPh8Xi0m1UYVIRRxOe+883jwwQd7oildht5ZuIlGaFuEfaGjazcFoQ6pzzU3N/v1F1p3sCWIDG9ERERERERERMSARt4xvPKOw1I58+bNA+C2227zK6W1MltMbGNjo6/wIK9iypQp3msIPS5wHsSBBx6Y9t3Nzc3emw33Vs83TJs2DXArwzO3kpXHHDLkYoRbWlp8/pA2BBDWrFnjc7U2dUV2RERExECA5p3i4mI+//nPA/DAAw8AqfzKwsLCnJsqKM9T5fHC6hi5WK98RZhvKbZ63bp1nsFTVRhFAMvLy7MqOIQsbiZ729DQ4Odt5YDme76zqrUoF3evvfbiqaeeAsiq1tDa2sr9998PpKo0tLa2ct555wH4YypJWFtbyxFHHAHAxRdfDKRKQOYTVEklrFCi6i3QfSx9yBqrxOSkSZO8PoWVIboK00cK1+GXKnRw1VVX+RqohxxyCODqgPYkLrvsMi90pVF0UCaku+P6XX4JCqGo/JJKd9TX13tDV4NXW1ubT9+Q4a/FP6NGjfIDdhfQE3kO+T0Sbhx5oyN5giiPdER5pKNP5ZErZUtz0TPPPAO4esovv/wykCqLuf/++3vjV4slRSq0trZuicHb6/IIUzaEiy++2NdKDndXBGegyNCV8dfa2pozFQTcIq1bb7017f65Fsp1gLzoL4sXL87aifKWW24BnKOTueDsnHPO8WkRqhn/pS99yR9XrXgZkJthPOaFPCBv0h036ctjSkNERERERERERMSARl8xvBERERERERERERG9gsjwRkREREREREREDGhEgzciIiIiIiIiImJAIxq8ERERERERERERAxrR4I2IiIiIiIiIiBjQiAZvRERERERERETEgEY0eCMiIiIiIiIiIgY0osEbEREREREREREx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WZkTGOLwww9v1zmqq53AFMuXO1G8hg8fjpwcZwo2cODAjlwOkEH1g/e1evVqAMArr7wCALj44oux777xwTtmzZqFjz/+GABw+eWXAwD22WcfdALtKg9VeBVFURRFUZSsJl02vLrajEfLIxEtk3g6VB4bN24EANx5550oLXUymZoqLuH/rdZESLZty/+p8Obm5gJwFMDrrnMSMPXp06ej169tJp60lMfdd98NAIhGnVjugwYNQjAYBAA888wzAICDD3YSc40fP14U24KCAgDA5MmT8etf/xoAcNJJJwEAPv30Uzn/fvvtB8BRezuI1o94tDziSXl51NXVYf369QAgbaRXr15obm4G4LYXKr3HHHMMHn/8cQBAKORkSx41ahQGDXIyAVPRXLVqFQBgwIAB2LzZSYzW2NgIwGmPffu2laVZyIj6cf311+PLL78E4I4527Ztk1cqvN27O0k9bdtGZaWTKO7II51s9VR8FyxYgFGjRgFwdyHNsWo3tKs80mXSoChpgQs8y0psHx999BEAoLa2FoBjAtCjh5Mxc/BgJ4Njv3792jy333nTATufvn37yrXTpIGTndzcXOloObkFIB06J7X8e/v27di6dWvcZ0rmwufMwXrVqlUyuIwbNw4AsNdee6GlpQUAcO211wJwzGAAYPHixdh///0BAE899RQAZ5C+9FInFwHbCye50WgUVVVVACCvAwbEZaxWlC7D5s2bUVjoJJDs2dPJfhyNRqXvu+giJ+fCvffeC8BZ+K1duxaAY/rA42k+9N133wGAjCmhUAglJSUAgB07dgAAKioq2jvhTSscN6ZPn47iYifZHSepbPO5ubk47zwnseCCBQsAAOvXrxcBpqKiIu6cV199Nd5++20AHZrodgg1aVAURVEURVGyGlV4lR8M0WhU1C4yf/58/PvfTibRnTt3AnC3b4cOHSqOPFyBFxUVYfTo0QCACy5wUtRT1c0UdRdwzRAKCgrk/1S3zTKg04TXtAFwlV0ek5OTI+r3D5m2dgkAYOXKlQCA1157DQAwZcqU1FyYB29dX7hwoTjHfPXVVwCAfffdV+r4XnvtBcB1RluzZo046xx66KEAgKuuukq2ZHn+SCQCwGlfbDt0zOnbt68c51WcFSUTYV/f0NAgai7reCAQECcttpenn34aALB27Vr5Lhk5ciSKiooAuPWfSm8sFpM+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\n",
      "text/plain": [
       "<Figure size 864x345.6 with 40 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_rows = 4\n",
    "n_cols = 10\n",
    "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        index = n_cols * row + col\n",
    "        plt.subplot(n_rows, n_cols, index + 1)\n",
    "        plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n",
    "        plt.axis('off')\n",
    "        plt.title(class_names[y_train[index]], fontsize=12)\n",
    "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n",
    "save_fig('fashion_mnist_plot', tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "model.add(keras.layers.Dense(300, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(100, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, activation=\"relu\"),\n",
    "    keras.layers.Dense(100, activation=\"relu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<tensorflow.python.keras.layers.core.Flatten at 0x7ff370af5780>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x7ff370af5c88>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x7ff330ab36d8>,\n",
       " <tensorflow.python.keras.layers.core.Dense at 0x7ff330ab3828>]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 300)               235500    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 100)               30100     \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                1010      \n",
      "=================================================================\n",
      "Total params: 266,610\n",
      "Trainable params: 266,610\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.utils.plot_model(model, \"my_fashion_mnist_model.png\", show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dense'"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hidden1 = model.layers[1]\n",
    "hidden1.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.get_layer(hidden1.name) is hidden1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "weights, biases = hidden1.get_weights()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.02448617, -0.00877795, -0.02189048, ..., -0.02766046,\n",
       "         0.03859074, -0.06889391],\n",
       "       [ 0.00476504, -0.03105379, -0.0586676 , ...,  0.00602964,\n",
       "        -0.02763776, -0.04165364],\n",
       "       [-0.06189284, -0.06901957,  0.07102345, ..., -0.04238207,\n",
       "         0.07121518, -0.07331658],\n",
       "       ...,\n",
       "       [-0.03048757,  0.02155137, -0.05400612, ..., -0.00113463,\n",
       "         0.00228987,  0.05581069],\n",
       "       [ 0.07061854, -0.06960931,  0.07038955, ..., -0.00384101,\n",
       "         0.00034875,  0.02878492],\n",
       "       [-0.06022581,  0.01577859, -0.02585464, ..., -0.00527829,\n",
       "         0.00272203, -0.06793761]], dtype=float32)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(784, 300)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300,)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=\"sgd\",\n",
    "              metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is equivalent to:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```python\n",
    "model.compile(loss=keras.losses.sparse_categorical_crossentropy,\n",
    "              optimizer=keras.optimizers.SGD(),\n",
    "              metrics=[keras.metrics.sparse_categorical_accuracy])\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "55000/55000 [==============================] - 2s 44us/sample - loss: 0.7226 - accuracy: 0.7641 - val_loss: 0.5073 - val_accuracy: 0.8320\n",
      "Epoch 2/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.4844 - accuracy: 0.8321 - val_loss: 0.4541 - val_accuracy: 0.8478\n",
      "Epoch 3/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.4414 - accuracy: 0.8464 - val_loss: 0.4373 - val_accuracy: 0.8508\n",
      "Epoch 4/30\n",
      "55000/55000 [==============================] - 2s 40us/sample - loss: 0.4129 - accuracy: 0.8549 - val_loss: 0.4170 - val_accuracy: 0.8562\n",
      "Epoch 5/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.3927 - accuracy: 0.8616 - val_loss: 0.3825 - val_accuracy: 0.8646\n",
      "Epoch 6/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.3772 - accuracy: 0.8665 - val_loss: 0.3736 - val_accuracy: 0.8680\n",
      "Epoch 7/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.3630 - accuracy: 0.8726 - val_loss: 0.3713 - val_accuracy: 0.8698\n",
      "Epoch 8/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.3523 - accuracy: 0.8746 - val_loss: 0.3657 - val_accuracy: 0.8710\n",
      "Epoch 9/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.3424 - accuracy: 0.8776 - val_loss: 0.3442 - val_accuracy: 0.8784\n",
      "Epoch 10/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.3329 - accuracy: 0.8809 - val_loss: 0.3523 - val_accuracy: 0.8774\n",
      "Epoch 11/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.3243 - accuracy: 0.8835 - val_loss: 0.3363 - val_accuracy: 0.8820\n",
      "Epoch 12/30\n",
      "55000/55000 [==============================] - 2s 40us/sample - loss: 0.3163 - accuracy: 0.8868 - val_loss: 0.3313 - val_accuracy: 0.8842\n",
      "Epoch 13/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.3075 - accuracy: 0.8898 - val_loss: 0.3320 - val_accuracy: 0.8814\n",
      "Epoch 14/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.3019 - accuracy: 0.8921 - val_loss: 0.3237 - val_accuracy: 0.8874\n",
      "Epoch 15/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.2956 - accuracy: 0.8938 - val_loss: 0.3173 - val_accuracy: 0.8898\n",
      "Epoch 16/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.2899 - accuracy: 0.8963 - val_loss: 0.3247 - val_accuracy: 0.8872\n",
      "Epoch 17/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.2836 - accuracy: 0.8985 - val_loss: 0.3175 - val_accuracy: 0.8920\n",
      "Epoch 18/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2783 - accuracy: 0.8996 - val_loss: 0.3095 - val_accuracy: 0.8910\n",
      "Epoch 19/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.2730 - accuracy: 0.9021 - val_loss: 0.3185 - val_accuracy: 0.8856\n",
      "Epoch 20/30\n",
      "55000/55000 [==============================] - 2s 37us/sample - loss: 0.2681 - accuracy: 0.9042 - val_loss: 0.3208 - val_accuracy: 0.8850\n",
      "Epoch 21/30\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 0.2635 - accuracy: 0.9047 - val_loss: 0.3005 - val_accuracy: 0.8946\n",
      "Epoch 22/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2576 - accuracy: 0.9077 - val_loss: 0.3107 - val_accuracy: 0.8878\n",
      "Epoch 23/30\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 0.2540 - accuracy: 0.9082 - val_loss: 0.3020 - val_accuracy: 0.8896\n",
      "Epoch 24/30\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.2492 - accuracy: 0.9102 - val_loss: 0.3105 - val_accuracy: 0.8850\n",
      "Epoch 25/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2453 - accuracy: 0.9126 - val_loss: 0.3100 - val_accuracy: 0.8906\n",
      "Epoch 26/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2408 - accuracy: 0.9145 - val_loss: 0.3278 - val_accuracy: 0.8846\n",
      "Epoch 27/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2367 - accuracy: 0.9155 - val_loss: 0.3130 - val_accuracy: 0.8856\n",
      "Epoch 28/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2323 - accuracy: 0.9178 - val_loss: 0.2954 - val_accuracy: 0.8926\n",
      "Epoch 29/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2287 - accuracy: 0.9184 - val_loss: 0.2998 - val_accuracy: 0.8924\n",
      "Epoch 30/30\n",
      "55000/55000 [==============================] - 2s 39us/sample - loss: 0.2256 - accuracy: 0.9195 - val_loss: 0.3049 - val_accuracy: 0.8882\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=30,\n",
    "                    validation_data=(X_valid, y_valid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'batch_size': 32,\n",
       " 'epochs': 30,\n",
       " 'steps': 1719,\n",
       " 'samples': 55000,\n",
       " 'verbose': 0,\n",
       " 'do_validation': True,\n",
       " 'metrics': ['loss', 'accuracy', 'val_loss', 'val_accuracy']}"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history.params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n"
     ]
    }
   ],
   "source": [
    "print(history.epoch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history.history.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure keras_learning_curves_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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/vnnpKen89xzzzF7doMNWCIiItKGmi1wnHOngDeBx8ws1syuAm4A/rP+uWY2AVgLTHHO/Vewgw2VcePGsW7dOrxeL3l5eWzfvp0rr7ySgwcPcsEFFzBnzhxuv/12Pv30U/Lz86murmbKlCksW7aMTz/9NNThi4iInHcCnaNmLvAKcAw4DtzlnNtrZhcD+4DLnXPfAUuAHsDf6kwM9w/n3M+DG3b7uummm9i5cyepqamYGcuXL6dfv368+uqrPPXUU3g8HuLi4lizZg2HDx8mMzOT6upqAP7whz+EOHoREZHzT0AFjnPuBHBjA/u/w/cScu3nsBoSXlLiG7llZjz11FM89dRTZxyfOXMmM2fOPOs6tdqIiIiEVodeqkFERESkNVTgiIiISNhRgSMiIiJhRwWOiIiIhB0VOCIiIhJ2VOCIiIhI2FGBIyIiImFHBU4HUFVVFeoQREREwkqgMxmH1v99EI4EeVmrfsnw8yeaPe3GG2/k0KFDlJWVcd9993HHHXewZcsWFi9ejNfrpXfv3vz973+npKSEefPmsWvXLsyM3/72t0yZMoW4uDj/hIEbNmxg8+bNrF69mlmzZpGYmMiePXsYOXIk06ZNY/78+Zw+fZquXbuyatUqhgwZgtfrZeHChbz77ruYGXPmzOHyyy/n2WefZdOmTQC89957rFixgjfffDO4ORIREemkOkeBE0KvvPIKiYmJnD59mtGjR3PDDTcwZ84ctm/fzuDBgzlx4gQAy5Yto0ePHmRn+wqxgoKCZu+dk5PD1q1biYyM5OTJk2zfvp2oqCi2bt3K4sWL2bhxIytXruSbb75hz549REVFceLECRISErj77rvJy8ujT58+rFq1iszMzDbNg4iISGfSOQqcAFpa2sqf//xnf0vJoUOHWLlyJePGjWPw4MEAJCYmArB161beeOMN/3UJCQnN3vvmm28mMjISgKKiImbOnMlXX32FmVFZWem/75133klUVNQZ3zdjxgxee+01MjMz2blzJ2vWrAnSTywiItL5dY4CJ0SysrLYunUrO3fupFu3bqSnp5OamsqXX3551rnOOeosMOpXd19ZWdkZx2JjY/3bS5Ys4ac//SmbNm3i22+/JT09vcn7ZmZmct111xETE8PNN9/sL4BERERELxk3qaioiISEBLp168aBAwf46KOPKC8v54MPPuCbb74B8HdRTZo0iWeffdZ/bW0XVd++fdm/fz/V1dX+lqDGvmvAgAEArF692r9/0qRJvPDCC/4XkWu/78ILL+TCCy/kd7/7HbNmzQrazywiIhIOVOA04Wc/+xlVVVWkpKSwZMkSxo4dS58+fVi5ciW//OUvSU1NZdq0aQA8/PDDFBQUMHz4cFJTU9m2bRsATzzxBNdeey0TJkygf//+jX7Xb37zGxYtWsRVV12F1+v17589ezYXX3wxKSkppKam8vrrr/uPTZ8+nYsuuojLL7+8jTIgIiLSOZlzLtQxMGTIEFe/22f//v0MHTo0RBF1Dvfccw9paWncfvvtAV9TXFxMfHx8q75Pv5OWycrK8nc1SttTvtuPct1+lOvmmdlu59yo+vv14kYndcUVVxAbG8vTTz8d6lBEREQ6HBU4ndTu3btDHYKIiEiHpXdwREREJOyowBEREZGwowJHREREwo4KHBEREQk7KnBEREQk7KjACZK4uLhGj3377bcMHz68HaMRERE5v3WKYeJP/teTHDhxIKj3TEpMYuGVC4N6TxEREekY1ILTiIULF/L888/7Py9dupRHH32UiRMnMnLkSJKTk3nrrbdafN+ysjIyMzNJTk4mLS3Nv6TD3r17ufLKKxkxYgQpKSl89dVXnDp1imuuuYbU1FSGDx/OunXrgvbziYiIhLNO0YITipaWjIwM5s+fz9y5cwFYv349W7ZsYcGCBXTv3p38/HzGjh3L9ddf3+Bq34157rnnAMjOzubAgQNMmjSJnJwcXnjhBe677z6mT59ORUUFXq+Xv/3tb1x44YX89a9/BXwLcoqIiEjz1ILTiLS0NI4dO8b333/P559/TkJCAv3792fx4sWkpKRw9dVXc/jwYY4ePdqi++7YsYMZM2YAkJSUxCWXXEJOTg4//vGPefzxx3nyySc5ePAgXbt2JTk5ma1bt7Jw4UL+8Y9/0KNHj7b4UUVERMKOCpwmTJ06lQ0bNrBu3ToyMjJYu3YteXl57N69m88++4y+fftSVlbWons2trjprbfeyttvv03Xrl2ZPHky77//Ppdddhm7d+8mOTmZRYsW8dhjjwXjxxIREQl7naKLKlQyMjKYM2cO+fn5fPDBB6xfv54LLrgAj8fDtm3bOHjwYIvvOW7cONauXcuECRPIycnhu+++Y8iQIXz99ddceuml3HvvvXz99df861//IikpicTERG677Tbi4uJYvXp18H9IERGRMKQCpwnDhg2juLiYAQMG0L9/f6ZPn851113HqFGjGDFiBElJSS2+59y5c7nzzjtJTk4mKiqK1atXEx0dzbp163jttdfweDz069ePRx55hE8++YQHHniAiIgIPB4PK1asaIOfUkREJPyowGlGdna2f7t3797s3LmzwfNKSkoavcegQYP44osvAIiJiWmwJWbRokUsWrTojH2TJ09m8uTJrYhaRETk/KZ3cERERCTsqAUniLKzs/0jpGpFR0fz8ccfhygiERGR85MKnCBKTk7ms88+C3UYIiIi5z11UYmIiEjYUYEjIiIiYUcFjoiIiIQdFTgiIiISdlTgBElcXFyoQxAREZEanWIU1ZHHH6d8/4Gg3jN6aBL9Fi8O6j07gqqqKqKiOsWvVUREpM2oBacRCxcu5Pnnn/d/Xrp0KY8++igTJ05k5MiRJCcn89ZbbwV0r5KSkkavW7NmDSkpKaSmpvrn0Dl69Cg33XQTqamppKam8s9//pNvv/2W4cOH+6/74x//yNKlSwFIT09n8eLFjB8/nmeeeYZ33nmHMWPGkJaWxtVXX+1f8bykpIS77rqL5ORkUlJS2LhxIy+//DILFizw3/fFF1/k/vvvb3XeREREOoJO8b/6oWhpycjIYP78+cydOxeA9evXs2XLFhYsWED37t3Jz89n7NixXH/99ZhZk/eKiYlh06ZNZ123b98+fv/73/Phhx/Su3dvTpw4AcC9997L+PHj2bRpE16vl5KSEgoKCpr8jsLCQj744AMACgoK+OijjzAzXnrpJZYvX87TTz/NsmXL6N69u3/5iYKCArp06UJKSgrLly/H4/GwatUq/vKXv5xr+kREREKqUxQ4oZCWlsaxY8f4/vvvycvLIyEhgf79+7NgwQK2b99OREQEhw8f5ujRo/Tr16/JeznnWLx48VnXvf/++0ydOpXevXsDkJiYCMD777/PmjVrAIiMjKRHjx7NFjjTpk3zb+fm5jJt2jT+/e9/U1FRweDBgwHYunUrL730kv+8hIQEACZMmMDmzZsZOnQolZWVJCcntzBbIiIiHYsKnCZMnTqVDRs2cOTIETIyMli7di15eXns3r0bj8fDoEGDKCsra/Y+jV3nnGu29adWVFQU1dXV/s/1vzc2Nta/PW/ePO6//36uv/56srKy/F1ZjX3f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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "plt.grid(True)\n",
    "plt.gca().set_ylim(0, 1)\n",
    "save_fig(\"keras_learning_curves_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 21us/sample - loss: 0.3378 - accuracy: 0.8781\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.33780701770782473, 0.8781]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.01, 0.  , 0.99],\n",
       "       [0.  , 0.  , 0.99, 0.  , 0.01, 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.  , 1.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new = X_test[:3]\n",
    "y_proba = model.predict(X_new)\n",
    "y_proba.round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = model.predict_classes(X_new)\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Ankle boot', 'Pullover', 'Trouser'], dtype='<U11')"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(class_names)[y_pred]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1], dtype=uint8)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_new = y_test[:3]\n",
    "y_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure fashion_mnist_images_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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tp566qlSG8uXL4/iF154IYp9HVfq2rPPffh8g8/bHXPMMaU2zjzzzCieNGlSFKeutVc577zzonjlypVRPHDgwNIy/lq7z0v6fFRqINTRo0e3aTs7m99f27dvr1zG1635/KV/X3xOTirnSqryGqnn/WNVebh68iL+M+HzuXfffXdpGb/e1N+LaiNHjoziVA7bH2v+ePWTkx5yyCGV6/X3I9Sz/3ZXbebuwhkbACArdGwAgKzQsQEAstJlZon04xROnDix1fiyyy7b7dvUSO67777O3oQuwefD6slD+Totn+fwbbZn/Ekfp/JnVWNDVk08KpVrNZ9++ukoridn6tebGg8VbZea8NPXIvra2vbk2Py4uz7P6icglsixAQDQqejYAABZoWMDAGSFjg0AkJUuc/MI0BF8caofwNgPBCBJ3/72t6P4kUceiWJ/80R7JmWsujFEqi7q9jfCpLZjy5YtUXz66adH8eTJk6P42muvLbXhb45J3fSAsqoC+ylTppSWueOOO6LY72M/OLwf/CHFH/NV2ymlbyhpZJyxAQCyQscGAMgKHRsAICvk2NCt+IGufb7I5+Ck8iCxgwcPjuLXXnstilNFsrtjosaqnE3qb/HF5n7iykGDBlWu1+fuVqxYUbkMqvfX5z73udIyP//5z6O4Z8+eUXzPPfdE8TXXXFO5Hb7Yup78bmoA9EbGGRsAICt0bACArNCxAQCyQo4N3crJJ58cxX4Q4NQkr35g4FdffbXjN6xB+EF1/eSzUrlubfz48bt1m3JRVWd49tlnl5bx9WP+vW9PzeSYMWOieOHChVGc+gysWbOmzevpTJyxAQCyQscGAMgKHRsAICvk2NCt+HyQH+fR1wlJ7ctjdFW+Zi81DqSf7HL//fffrduUi3omoPVGjhwZxXPnzo3ibdu2RfFTTz1VauOkk06KYl/H5ifO9ftXkjZs2FC9sQ2k+3xiAQDdAh0bACArdGwAgKzQsQEAssLNI+hWRowYEcXHHXdcFKeKU6tujti5c2cUp24SqJokdE/x2+G39bDDDovic845p9TG5s2bo3jChAkdtHV5Sw0uXGXatGlRfOSRR0bxBRdcEMX+RpGUqVOnRrGffLZPnz6lZU499dTKdhsJZ2wAgKzQsQEAskLHBgDIijXKtX8AADoCZ2wAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAskLHBgDICh0bACArdGwAgKzQsQEAsvL/P54zJxT7G5kAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 518.4x172.8 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(7.2, 2.4))\n",
    "for index, image in enumerate(X_new):\n",
    "    plt.subplot(1, 3, index + 1)\n",
    "    plt.imshow(image, cmap=\"binary\", interpolation=\"nearest\")\n",
    "    plt.axis('off')\n",
    "    plt.title(class_names[y_test[index]], fontsize=12)\n",
    "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n",
    "save_fig('fashion_mnist_images_plot', tight_layout=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regression MLP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's load, split and scale the California housing dataset (the original one, not the modified one as in chapter 2):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "\n",
    "X_train_full, X_test, y_train_full, y_test = train_test_split(housing.data, housing.target, random_state=42)\n",
    "X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, random_state=42)\n",
    "\n",
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_valid = scaler.transform(X_valid)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610 [==============================] - 1s 44us/sample - loss: 1.6205 - val_loss: 2.0374\n",
      "Epoch 2/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.7162 - val_loss: 0.6571\n",
      "Epoch 3/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.6356 - val_loss: 0.5996\n",
      "Epoch 4/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5989 - val_loss: 0.5662\n",
      "Epoch 5/20\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.5713 - val_loss: 0.5489\n",
      "Epoch 6/20\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.5491 - val_loss: 0.5204\n",
      "Epoch 7/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5301 - val_loss: 0.5018\n",
      "Epoch 8/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.5142 - val_loss: 0.4815\n",
      "Epoch 9/20\n",
      "11610/11610 [==============================] - 0s 27us/sample - loss: 0.5004 - val_loss: 0.4695\n",
      "Epoch 10/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4883 - val_loss: 0.4605\n",
      "Epoch 11/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4786 - val_loss: 0.4495\n",
      "Epoch 12/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4697 - val_loss: 0.4382\n",
      "Epoch 13/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4621 - val_loss: 0.4309\n",
      "Epoch 14/20\n",
      "11610/11610 [==============================] - 0s 27us/sample - loss: 0.4556 - val_loss: 0.4247\n",
      "Epoch 15/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4497 - val_loss: 0.4200\n",
      "Epoch 16/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4443 - val_loss: 0.4149\n",
      "Epoch 17/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4397 - val_loss: 0.4108\n",
      "Epoch 18/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4354 - val_loss: 0.4059\n",
      "Epoch 19/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4315 - val_loss: 0.4003\n",
      "Epoch 20/20\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4281 - val_loss: 0.3981\n",
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.4218\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=X_train.shape[1:]),\n",
    "    keras.layers.Dense(1)\n",
    "])\n",
    "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)\n",
    "X_new = X_test[:3]\n",
    "y_pred = model.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(pd.DataFrame(history.history))\n",
    "plt.grid(True)\n",
    "plt.gca().set_ylim(0, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.37310064],\n",
       "       [1.6790789 ],\n",
       "       [3.0817137 ]], dtype=float32)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Functional API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Not all neural network models are simply sequential. Some may have complex topologies. Some may have multiple inputs and/or multiple outputs. For example, a Wide & Deep neural network (see [paper](https://ai.google/research/pubs/pub45413)) connects all or part of the inputs directly to the output layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_ = keras.layers.Input(shape=X_train.shape[1:])\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_, hidden2])\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "model = keras.models.Model(inputs=[input_], outputs=[output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            [(None, 8)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "dense_5 (Dense)                 (None, 30)           270         input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_6 (Dense)                 (None, 30)           930         dense_5[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "concatenate (Concatenate)       (None, 38)           0           input_1[0][0]                    \n",
      "                                                                 dense_6[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_7 (Dense)                 (None, 1)            39          concatenate[0][0]                \n",
      "==================================================================================================\n",
      "Total params: 1,239\n",
      "Trainable params: 1,239\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610 [==============================] - 1s 47us/sample - loss: 1.2390 - val_loss: 0.6566\n",
      "Epoch 2/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.6312 - val_loss: 0.6734\n",
      "Epoch 3/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5886 - val_loss: 0.5574\n",
      "Epoch 4/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5595 - val_loss: 0.5235\n",
      "Epoch 5/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5361 - val_loss: 0.5011\n",
      "Epoch 6/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5178 - val_loss: 0.5065\n",
      "Epoch 7/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5016 - val_loss: 0.4699\n",
      "Epoch 8/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4888 - val_loss: 0.4745\n",
      "Epoch 9/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4772 - val_loss: 0.4425\n",
      "Epoch 10/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4673 - val_loss: 0.4384\n",
      "Epoch 11/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4586 - val_loss: 0.4533\n",
      "Epoch 12/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4504 - val_loss: 0.4179\n",
      "Epoch 13/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4435 - val_loss: 0.4137\n",
      "Epoch 14/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4376 - val_loss: 0.4062\n",
      "Epoch 15/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4318 - val_loss: 0.4541\n",
      "Epoch 16/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4266 - val_loss: 0.3952\n",
      "Epoch 17/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4221 - val_loss: 0.3910\n",
      "Epoch 18/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4173 - val_loss: 0.4205\n",
      "Epoch 19/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4132 - val_loss: 0.3830\n",
      "Epoch 20/20\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4096 - val_loss: 0.3923\n",
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.4042\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "history = model.fit(X_train, y_train, epochs=20,\n",
    "                    validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)\n",
    "y_pred = model.predict(X_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What if you want to send different subsets of input features through the wide or deep paths? We will send 5 features (features 0 to 4), and 6 through the deep path (features 2 to 7). Note that 3 features will go through both (features 2, 3 and 4)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n",
    "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_A, hidden2])\n",
    "output = keras.layers.Dense(1, name=\"output\")(concat)\n",
    "model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610 [==============================] - 1s 50us/sample - loss: 1.8127 - val_loss: 2.1165\n",
      "Epoch 2/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.6852 - val_loss: 0.6178\n",
      "Epoch 3/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5965 - val_loss: 0.5600\n",
      "Epoch 4/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5587 - val_loss: 0.5269\n",
      "Epoch 5/20\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5321 - val_loss: 0.5185\n",
      "Epoch 6/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.5129 - val_loss: 0.4803\n",
      "Epoch 7/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4959 - val_loss: 0.4689\n",
      "Epoch 8/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4837 - val_loss: 0.4498\n",
      "Epoch 9/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4734 - val_loss: 0.4387\n",
      "Epoch 10/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4646 - val_loss: 0.4306\n",
      "Epoch 11/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4571 - val_loss: 0.4262\n",
      "Epoch 12/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4507 - val_loss: 0.4173\n",
      "Epoch 13/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4456 - val_loss: 0.4124\n",
      "Epoch 14/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4422 - val_loss: 0.4084\n",
      "Epoch 15/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4386 - val_loss: 0.4351\n",
      "Epoch 16/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4361 - val_loss: 0.4017\n",
      "Epoch 17/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4326 - val_loss: 0.3990\n",
      "Epoch 18/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4296 - val_loss: 0.4148\n",
      "Epoch 19/20\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4278 - val_loss: 0.3957\n",
      "Epoch 20/20\n",
      "11610/11610 [==============================] - 0s 33us/sample - loss: 0.4259 - val_loss: 0.3976\n",
      "5160/5160 [==============================] - 0s 16us/sample - loss: 0.4202\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "\n",
    "X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:]\n",
    "X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:]\n",
    "X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:]\n",
    "X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]\n",
    "\n",
    "history = model.fit((X_train_A, X_train_B), y_train, epochs=20,\n",
    "                    validation_data=((X_valid_A, X_valid_B), y_valid))\n",
    "mse_test = model.evaluate((X_test_A, X_test_B), y_test)\n",
    "y_pred = model.predict((X_new_A, X_new_B))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adding an auxiliary output for regularization:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n",
    "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_A, hidden2])\n",
    "output = keras.layers.Dense(1, name=\"main_output\")(concat)\n",
    "aux_output = keras.layers.Dense(1, name=\"aux_output\")(hidden2)\n",
    "model = keras.models.Model(inputs=[input_A, input_B],\n",
    "                           outputs=[output, aux_output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=[\"mse\", \"mse\"], loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(lr=1e-3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/20\n",
      "11610/11610 [==============================] - 1s 68us/sample - loss: 2.1346 - main_output_loss: 1.9194 - aux_output_loss: 4.0632 - val_loss: 2.9120 - val_main_output_loss: 2.2555 - val_aux_output_loss: 8.8088\n",
      "Epoch 2/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.8954 - main_output_loss: 0.7048 - aux_output_loss: 2.6119 - val_loss: 1.4135 - val_main_output_loss: 0.6348 - val_aux_output_loss: 8.4172\n",
      "Epoch 3/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.7400 - main_output_loss: 0.6077 - aux_output_loss: 1.9305 - val_loss: 1.3594 - val_main_output_loss: 0.5885 - val_aux_output_loss: 8.2925\n",
      "Epoch 4/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6749 - main_output_loss: 0.5690 - aux_output_loss: 1.6264 - val_loss: 1.2789 - val_main_output_loss: 0.5611 - val_aux_output_loss: 7.7340\n",
      "Epoch 5/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6351 - main_output_loss: 0.5420 - aux_output_loss: 1.4729 - val_loss: 1.1841 - val_main_output_loss: 0.5656 - val_aux_output_loss: 6.7464\n",
      "Epoch 6/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6068 - main_output_loss: 0.5213 - aux_output_loss: 1.3763 - val_loss: 1.0614 - val_main_output_loss: 0.5202 - val_aux_output_loss: 5.9282\n",
      "Epoch 7/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.5832 - main_output_loss: 0.5028 - aux_output_loss: 1.3072 - val_loss: 0.9555 - val_main_output_loss: 0.5111 - val_aux_output_loss: 4.9515\n",
      "Epoch 8/20\n",
      "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5651 - main_output_loss: 0.4892 - aux_output_loss: 1.2463 - val_loss: 0.8426 - val_main_output_loss: 0.4713 - val_aux_output_loss: 4.1805\n",
      "Epoch 9/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5497 - main_output_loss: 0.4772 - aux_output_loss: 1.2017 - val_loss: 0.7632 - val_main_output_loss: 0.4633 - val_aux_output_loss: 3.4589\n",
      "Epoch 10/20\n",
      "11610/11610 [==============================] - 0s 38us/sample - loss: 0.5368 - main_output_loss: 0.4671 - aux_output_loss: 1.1631 - val_loss: 0.6954 - val_main_output_loss: 0.4467 - val_aux_output_loss: 2.9307\n",
      "Epoch 11/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5257 - main_output_loss: 0.4586 - aux_output_loss: 1.1297 - val_loss: 0.6413 - val_main_output_loss: 0.4292 - val_aux_output_loss: 2.5478\n",
      "Epoch 12/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5162 - main_output_loss: 0.4516 - aux_output_loss: 1.0989 - val_loss: 0.5950 - val_main_output_loss: 0.4232 - val_aux_output_loss: 2.1396\n",
      "Epoch 13/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5082 - main_output_loss: 0.4454 - aux_output_loss: 1.0729 - val_loss: 0.5608 - val_main_output_loss: 0.4203 - val_aux_output_loss: 1.8236\n",
      "Epoch 14/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.5022 - main_output_loss: 0.4416 - aux_output_loss: 1.0487 - val_loss: 0.5324 - val_main_output_loss: 0.4142 - val_aux_output_loss: 1.5944\n",
      "Epoch 15/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4964 - main_output_loss: 0.4376 - aux_output_loss: 1.0240 - val_loss: 0.5206 - val_main_output_loss: 0.4118 - val_aux_output_loss: 1.4985\n",
      "Epoch 16/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4914 - main_output_loss: 0.4344 - aux_output_loss: 1.0054 - val_loss: 0.4939 - val_main_output_loss: 0.4017 - val_aux_output_loss: 1.3221\n",
      "Epoch 17/20\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4865 - main_output_loss: 0.4312 - aux_output_loss: 0.9841 - val_loss: 0.4803 - val_main_output_loss: 0.3993 - val_aux_output_loss: 1.2082\n",
      "Epoch 18/20\n",
      "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4820 - main_output_loss: 0.4281 - aux_output_loss: 0.9663 - val_loss: 0.4820 - val_main_output_loss: 0.4053 - val_aux_output_loss: 1.1710\n",
      "Epoch 19/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4786 - main_output_loss: 0.4264 - aux_output_loss: 0.9490 - val_loss: 0.4661 - val_main_output_loss: 0.3979 - val_aux_output_loss: 1.0790\n",
      "Epoch 20/20\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4753 - main_output_loss: 0.4245 - aux_output_loss: 0.9320 - val_loss: 0.4598 - val_main_output_loss: 0.3968 - val_aux_output_loss: 1.0257\n"
     ]
    }
   ],
   "source": [
    "history = model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20,\n",
    "                    validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 19us/sample - loss: 0.4656 - main_output_loss: 0.4165 - aux_output_loss: 0.9111\n"
     ]
    }
   ],
   "source": [
    "total_loss, main_loss, aux_loss = model.evaluate(\n",
    "    [X_test_A, X_test_B], [y_test, y_test])\n",
    "y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The subclassing API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "class WideAndDeepModel(keras.models.Model):\n",
    "    def __init__(self, units=30, activation=\"relu\", **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.hidden1 = keras.layers.Dense(units, activation=activation)\n",
    "        self.hidden2 = keras.layers.Dense(units, activation=activation)\n",
    "        self.main_output = keras.layers.Dense(1)\n",
    "        self.aux_output = keras.layers.Dense(1)\n",
    "        \n",
    "    def call(self, inputs):\n",
    "        input_A, input_B = inputs\n",
    "        hidden1 = self.hidden1(input_B)\n",
    "        hidden2 = self.hidden2(hidden1)\n",
    "        concat = keras.layers.concatenate([input_A, hidden2])\n",
    "        main_output = self.main_output(concat)\n",
    "        aux_output = self.aux_output(hidden2)\n",
    "        return main_output, aux_output\n",
    "\n",
    "model = WideAndDeepModel(30, activation=\"relu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610 [==============================] - 1s 78us/sample - loss: 2.2719 - output_1_loss: 2.1554 - output_2_loss: 3.3117 - val_loss: 4.3377 - val_output_1_loss: 2.7732 - val_output_2_loss: 18.3999\n",
      "Epoch 2/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.9891 - output_1_loss: 0.8653 - output_2_loss: 2.1062 - val_loss: 2.0073 - val_output_1_loss: 0.7581 - val_output_2_loss: 13.2427\n",
      "Epoch 3/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.8320 - output_1_loss: 0.7303 - output_2_loss: 1.7468 - val_loss: 1.7215 - val_output_1_loss: 0.7114 - val_output_2_loss: 10.8051\n",
      "Epoch 4/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.7658 - output_1_loss: 0.6760 - output_2_loss: 1.5726 - val_loss: 1.4708 - val_output_1_loss: 0.6454 - val_output_2_loss: 8.8938\n",
      "Epoch 5/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.7223 - output_1_loss: 0.6394 - output_2_loss: 1.4683 - val_loss: 1.3057 - val_output_1_loss: 0.6852 - val_output_2_loss: 6.8846\n",
      "Epoch 6/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.6909 - output_1_loss: 0.6132 - output_2_loss: 1.3901 - val_loss: 1.1005 - val_output_1_loss: 0.5915 - val_output_2_loss: 5.6773\n",
      "Epoch 7/10\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6636 - output_1_loss: 0.5894 - output_2_loss: 1.3330 - val_loss: 0.9605 - val_output_1_loss: 0.5611 - val_output_2_loss: 4.5516\n",
      "Epoch 8/10\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6406 - output_1_loss: 0.5691 - output_2_loss: 1.2833 - val_loss: 0.8480 - val_output_1_loss: 0.5263 - val_output_2_loss: 3.7399\n",
      "Epoch 9/10\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.6199 - output_1_loss: 0.5507 - output_2_loss: 1.2416 - val_loss: 0.7650 - val_output_1_loss: 0.5085 - val_output_2_loss: 3.0718\n",
      "Epoch 10/10\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.6019 - output_1_loss: 0.5351 - output_2_loss: 1.2026 - val_loss: 0.7004 - val_output_1_loss: 0.4916 - val_output_2_loss: 2.5772\n",
      "5160/5160 [==============================] - 0s 18us/sample - loss: 0.5819 - output_1_loss: 0.5174 - output_2_loss: 1.1749\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "history = model.fit((X_train_A, X_train_B), (y_train, y_train), epochs=10,\n",
    "                    validation_data=((X_valid_A, X_valid_B), (y_valid, y_valid)))\n",
    "total_loss, main_loss, aux_loss = model.evaluate((X_test_A, X_test_B), (y_test, y_test))\n",
    "y_pred_main, y_pred_aux = model.predict((X_new_A, X_new_B))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = WideAndDeepModel(30, activation=\"relu\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Saving and Restoring"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610 [==============================] - 1s 46us/sample - loss: 1.8423 - val_loss: 5.2165\n",
      "Epoch 2/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.6876 - val_loss: 0.7732\n",
      "Epoch 3/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5954 - val_loss: 0.5446\n",
      "Epoch 4/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5553 - val_loss: 0.5425\n",
      "Epoch 5/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5268 - val_loss: 0.5539\n",
      "Epoch 6/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.5049 - val_loss: 0.4701\n",
      "Epoch 7/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4852 - val_loss: 0.4562\n",
      "Epoch 8/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4706 - val_loss: 0.4452\n",
      "Epoch 9/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4576 - val_loss: 0.4406\n",
      "Epoch 10/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.4476 - val_loss: 0.4185\n",
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.4376\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid))\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save(\"my_keras_model.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.load_model(\"my_keras_model.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.551559 ],\n",
       "       [1.6555369],\n",
       "       [3.0014234]], dtype=float32)"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save_weights(\"my_keras_weights.ckpt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.training.tracking.util.CheckpointLoadStatus at 0x7ff383d586d8>"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.load_weights(\"my_keras_weights.ckpt\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using Callbacks during Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/10\n",
      "11610/11610 [==============================] - 1s 47us/sample - loss: 1.8423 - val_loss: 5.2165\n",
      "Epoch 2/10\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.6876 - val_loss: 0.7732\n",
      "Epoch 3/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5954 - val_loss: 0.5446\n",
      "Epoch 4/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5553 - val_loss: 0.5425\n",
      "Epoch 5/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5268 - val_loss: 0.5539\n",
      "Epoch 6/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.5049 - val_loss: 0.4701\n",
      "Epoch 7/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4852 - val_loss: 0.4562\n",
      "Epoch 8/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4706 - val_loss: 0.4452\n",
      "Epoch 9/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4576 - val_loss: 0.4406\n",
      "Epoch 10/10\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4476 - val_loss: 0.4185\n",
      "5160/5160 [==============================] - 0s 22us/sample - loss: 0.4376\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"my_keras_model.h5\", save_best_only=True)\n",
    "history = model.fit(X_train, y_train, epochs=10,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb])\n",
    "model = keras.models.load_model(\"my_keras_model.h5\") # rollback to best model\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610 [==============================] - 1s 47us/sample - loss: 0.4385 - val_loss: 0.4287\n",
      "Epoch 2/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4319 - val_loss: 0.4117\n",
      "Epoch 3/100\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.4252 - val_loss: 0.3975\n",
      "Epoch 4/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4199 - val_loss: 0.3943\n",
      "Epoch 5/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4150 - val_loss: 0.3964\n",
      "Epoch 6/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4110 - val_loss: 0.3907\n",
      "Epoch 7/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4070 - val_loss: 0.3823\n",
      "Epoch 8/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4036 - val_loss: 0.3786\n",
      "Epoch 9/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.4003 - val_loss: 0.3739\n",
      "Epoch 10/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3973 - val_loss: 0.3724\n",
      "Epoch 11/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3944 - val_loss: 0.3697\n",
      "Epoch 12/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3916 - val_loss: 0.3670\n",
      "Epoch 13/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3892 - val_loss: 0.3638\n",
      "Epoch 14/100\n",
      "11610/11610 [==============================] - 0s 32us/sample - loss: 0.3869 - val_loss: 0.3633\n",
      "Epoch 15/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3845 - val_loss: 0.4051\n",
      "Epoch 16/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3826 - val_loss: 0.3662\n",
      "Epoch 17/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3805 - val_loss: 0.3554\n",
      "<<132 more lines>>\n",
      "Epoch 84/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3312 - val_loss: 0.3282\n",
      "Epoch 85/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3307 - val_loss: 0.3379\n",
      "Epoch 86/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3306 - val_loss: 0.3163\n",
      "Epoch 87/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3302 - val_loss: 0.3377\n",
      "Epoch 88/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3300 - val_loss: 0.3340\n",
      "Epoch 89/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3295 - val_loss: 0.3158\n",
      "Epoch 90/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3294 - val_loss: 0.3519\n",
      "Epoch 91/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3289 - val_loss: 0.3142\n",
      "Epoch 92/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3286 - val_loss: 0.3619\n",
      "Epoch 93/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3282 - val_loss: 0.3270\n",
      "Epoch 94/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3282 - val_loss: 0.4632\n",
      "Epoch 95/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3284 - val_loss: 0.3371\n",
      "Epoch 96/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3275 - val_loss: 0.4659\n",
      "Epoch 97/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3278 - val_loss: 0.3156\n",
      "Epoch 98/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3265 - val_loss: 0.3259\n",
      "Epoch 99/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.3262 - val_loss: 0.3407\n",
      "Epoch 100/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3264 - val_loss: 0.3176\n",
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.3271\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=1e-3))\n",
    "early_stopping_cb = keras.callbacks.EarlyStopping(patience=10,\n",
    "                                                  restore_best_weights=True)\n",
    "history = model.fit(X_train, y_train, epochs=100,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, early_stopping_cb])\n",
    "mse_test = model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "class PrintValTrainRatioCallback(keras.callbacks.Callback):\n",
    "    def on_epoch_end(self, epoch, logs):\n",
    "        print(\"\\nval/train: {:.2f}\".format(logs[\"val_loss\"] / logs[\"loss\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "10912/11610 [===========================>..] - ETA: 0s - loss: 0.3231\n",
      "val/train: 1.16\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3256 - val_loss: 0.3785\n"
     ]
    }
   ],
   "source": [
    "val_train_ratio_cb = PrintValTrainRatioCallback()\n",
    "history = model.fit(X_train, y_train, epochs=1,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[val_train_ratio_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorBoard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "root_logdir = os.path.join(os.curdir, \"my_logs\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./my_logs/run_2020_01_27-10_15_44'"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_run_logdir():\n",
    "    import time\n",
    "    run_id = time.strftime(\"run_%Y_%m_%d-%H_%M_%S\")\n",
    "    return os.path.join(root_logdir, run_id)\n",
    "\n",
    "run_logdir = get_run_logdir()\n",
    "run_logdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    \n",
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=1e-3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/30\n",
      "11610/11610 [==============================] - 1s 52us/sample - loss: 1.8423 - val_loss: 5.2165\n",
      "Epoch 2/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.6876 - val_loss: 0.7732\n",
      "Epoch 3/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5954 - val_loss: 0.5446\n",
      "Epoch 4/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5553 - val_loss: 0.5425\n",
      "Epoch 5/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.5268 - val_loss: 0.5539\n",
      "Epoch 6/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5049 - val_loss: 0.4701\n",
      "Epoch 7/30\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4852 - val_loss: 0.4562\n",
      "Epoch 8/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4706 - val_loss: 0.4452\n",
      "Epoch 9/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4576 - val_loss: 0.4406\n",
      "Epoch 10/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4476 - val_loss: 0.4185\n",
      "Epoch 11/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4388 - val_loss: 0.4285\n",
      "Epoch 12/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4313 - val_loss: 0.4071\n",
      "Epoch 13/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4252 - val_loss: 0.3998\n",
      "Epoch 14/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4198 - val_loss: 0.3970\n",
      "Epoch 15/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4152 - val_loss: 0.4115\n",
      "Epoch 16/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4109 - val_loss: 0.3849\n",
      "Epoch 17/30\n",
      "11610/11610 [==============================] - 0s 39us/sample - loss: 0.4073 - val_loss: 0.3862\n",
      "Epoch 18/30\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4037 - val_loss: 0.3907\n",
      "Epoch 19/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4003 - val_loss: 0.3751\n",
      "Epoch 20/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3974 - val_loss: 0.3711\n",
      "Epoch 21/30\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.3945 - val_loss: 0.3733\n",
      "Epoch 22/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3919 - val_loss: 0.3676\n",
      "Epoch 23/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3893 - val_loss: 0.3669\n",
      "Epoch 24/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3869 - val_loss: 0.3614\n",
      "Epoch 25/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3846 - val_loss: 0.3600\n",
      "Epoch 26/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3825 - val_loss: 0.3578\n",
      "Epoch 27/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3802 - val_loss: 0.3676\n",
      "Epoch 28/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.3781 - val_loss: 0.3545\n",
      "Epoch 29/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3761 - val_loss: 0.3612\n",
      "Epoch 30/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.3742 - val_loss: 0.3555\n"
     ]
    }
   ],
   "source": [
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\n",
    "history = model.fit(X_train, y_train, epochs=30,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, tensorboard_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To start the TensorBoard server, one option is to open a terminal, if needed activate the virtualenv where you installed TensorBoard, go to this notebook's directory, then type:\n",
    "\n",
    "```bash\n",
    "$ tensorboard --logdir=./my_logs --port=6006\n",
    "```\n",
    "\n",
    "You can then open your web browser to [localhost:6006](http://localhost:6006) and use TensorBoard. Once you are done, press Ctrl-C in the terminal window, this will shutdown the TensorBoard server.\n",
    "\n",
    "Alternatively, you can load TensorBoard's Jupyter extension and run it like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "      <iframe id=\"tensorboard-frame-52a06f24fbc7eece\" width=\"100%\" height=\"800\" frameborder=\"0\">\n",
       "      </iframe>\n",
       "      <script>\n",
       "        (function() {\n",
       "          const frame = document.getElementById(\"tensorboard-frame-52a06f24fbc7eece\");\n",
       "          const url = new URL(\"/\", window.location);\n",
       "          url.port = 6006;\n",
       "          frame.src = url;\n",
       "        })();\n",
       "      </script>\n",
       "  "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%load_ext tensorboard\n",
    "%tensorboard --logdir=./my_logs --port=6006"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./my_logs/run_2020_01_27-10_18_25'"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run_logdir2 = get_run_logdir()\n",
    "run_logdir2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])    \n",
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=0.05))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/30\n",
      "11610/11610 [==============================] - 1s 52us/sample - loss: 5.6341 - val_loss: 1.3205\n",
      "Epoch 2/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 1.2704 - val_loss: 1.0757\n",
      "Epoch 3/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.9370 - val_loss: 0.7769\n",
      "Epoch 4/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.8854 - val_loss: 0.8254\n",
      "Epoch 5/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.9501 - val_loss: 0.9415\n",
      "Epoch 6/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.8283 - val_loss: 0.6111\n",
      "Epoch 7/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.8095 - val_loss: 0.7394\n",
      "Epoch 8/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 1.1857 - val_loss: 1.0356\n",
      "Epoch 9/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.8920 - val_loss: 0.6564\n",
      "Epoch 10/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 1.2295 - val_loss: 1.1277\n",
      "Epoch 11/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.8992 - val_loss: 0.6219\n",
      "Epoch 12/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.7697 - val_loss: 0.6959\n",
      "Epoch 13/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.7375 - val_loss: 0.6471\n",
      "Epoch 14/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.9825 - val_loss: 1.0278\n",
      "Epoch 15/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.9653 - val_loss: 0.9092\n",
      "Epoch 16/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.9008 - val_loss: 0.8451\n",
      "Epoch 17/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.7838 - val_loss: 0.5818\n",
      "Epoch 18/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.9960 - val_loss: 1.0598\n",
      "Epoch 19/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.7887 - val_loss: 0.6405\n",
      "Epoch 20/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.5706 - val_loss: 0.5093\n",
      "Epoch 21/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.5192 - val_loss: 0.5457\n",
      "Epoch 22/30\n",
      "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4971 - val_loss: 0.4644\n",
      "Epoch 23/30\n",
      "11610/11610 [==============================] - 0s 38us/sample - loss: 0.4815 - val_loss: 0.4120\n",
      "Epoch 24/30\n",
      "11610/11610 [==============================] - 0s 37us/sample - loss: 0.4678 - val_loss: 0.4853\n",
      "Epoch 25/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4490 - val_loss: 0.3972\n",
      "Epoch 26/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4348 - val_loss: 0.4258\n",
      "Epoch 27/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4377 - val_loss: 0.3829\n",
      "Epoch 28/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4353 - val_loss: 0.3860\n",
      "Epoch 29/30\n",
      "11610/11610 [==============================] - 0s 35us/sample - loss: 0.4209 - val_loss: 0.3763\n",
      "Epoch 30/30\n",
      "11610/11610 [==============================] - 0s 36us/sample - loss: 0.4441 - val_loss: 0.4186\n"
     ]
    }
   ],
   "source": [
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir2)\n",
    "history = model.fit(X_train, y_train, epochs=30,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, tensorboard_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice how TensorBoard now sees two runs, and you can compare the learning curves."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Check out the other available logging options:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function __init__ in module tensorflow.python.keras.callbacks:\n",
      "\n",
      "__init__(self, log_dir='logs', histogram_freq=0, write_graph=True, write_images=False, update_freq='epoch', profile_batch=2, embeddings_freq=0, embeddings_metadata=None, **kwargs)\n",
      "    Initialize self.  See help(type(self)) for accurate signature.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(keras.callbacks.TensorBoard.__init__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hyperparameter Tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):\n",
    "    model = keras.models.Sequential()\n",
    "    model.add(keras.layers.InputLayer(input_shape=input_shape))\n",
    "    for layer in range(n_hidden):\n",
    "        model.add(keras.layers.Dense(n_neurons, activation=\"relu\"))\n",
    "    model.add(keras.layers.Dense(1))\n",
    "    optimizer = keras.optimizers.SGD(lr=learning_rate)\n",
    "    model.compile(loss=\"mse\", optimizer=optimizer)\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610 [==============================] - 0s 43us/sample - loss: 1.1399 - val_loss: 24.4309\n",
      "Epoch 2/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.7393 - val_loss: 3.2896\n",
      "Epoch 3/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.5374 - val_loss: 0.6080\n",
      "Epoch 4/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.4796 - val_loss: 0.4532\n",
      "Epoch 5/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4536 - val_loss: 0.4221\n",
      "Epoch 6/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4373 - val_loss: 0.4144\n",
      "Epoch 7/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4256 - val_loss: 0.4025\n",
      "Epoch 8/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.4178 - val_loss: 0.3938\n",
      "Epoch 9/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4114 - val_loss: 0.4085\n",
      "Epoch 10/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.4060 - val_loss: 0.3974\n",
      "Epoch 11/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.4018 - val_loss: 0.3847\n",
      "Epoch 12/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3978 - val_loss: 0.3818\n",
      "Epoch 13/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.3943 - val_loss: 0.3820\n",
      "Epoch 14/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.3915 - val_loss: 0.3766\n",
      "Epoch 15/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3888 - val_loss: 0.4268\n",
      "Epoch 16/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.3862 - val_loss: 0.3638\n",
      "Epoch 17/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3842 - val_loss: 0.3666\n",
      "<<53 more lines>>\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3533 - val_loss: 0.3355\n",
      "Epoch 45/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3529 - val_loss: 0.3329\n",
      "Epoch 46/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3522 - val_loss: 0.3393\n",
      "Epoch 47/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.3510 - val_loss: 0.4172\n",
      "Epoch 48/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3515 - val_loss: 0.3758\n",
      "Epoch 49/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3506 - val_loss: 0.4285\n",
      "Epoch 50/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.3506 - val_loss: 0.4004\n",
      "Epoch 51/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3501 - val_loss: 0.3300\n",
      "Epoch 52/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3495 - val_loss: 0.3300\n",
      "Epoch 53/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3485 - val_loss: 0.3599\n",
      "Epoch 54/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3479 - val_loss: 0.3424\n",
      "Epoch 55/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3475 - val_loss: 0.3752\n",
      "Epoch 56/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3472 - val_loss: 0.4231\n",
      "Epoch 57/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3474 - val_loss: 0.3728\n",
      "Epoch 58/100\n",
      "11610/11610 [==============================] - 0s 28us/sample - loss: 0.3464 - val_loss: 0.3455\n",
      "Epoch 59/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3458 - val_loss: 0.3647\n",
      "Epoch 60/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3451 - val_loss: 0.4226\n",
      "Epoch 61/100\n",
      "11610/11610 [==============================] - 0s 29us/sample - loss: 0.3456 - val_loss: 0.3635\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x7ff32141f630>"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras_reg.fit(X_train, y_train, epochs=100,\n",
    "              validation_data=(X_valid, y_valid),\n",
    "              callbacks=[keras.callbacks.EarlyStopping(patience=10)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 14us/sample - loss: 0.3464\n"
     ]
    }
   ],
   "source": [
    "mse_test = keras_reg.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = keras_reg.predict(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Warning**: the following cell crashes at the end of training. This seems to be caused by [Keras issue #13586](https://github.com/keras-team/keras/issues/13586), which was triggered by a recent change in Scikit-Learn. [Pull Request #13598](https://github.com/keras-team/keras/pull/13598) seems to fix the issue, so this problem should be resolved soon."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n",
      "[CV] learning_rate=0.001683454924600351, n_hidden=0, n_neurons=15 ....\n",
      "Train on 7740 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "  32/7740 [..............................] - ETA: 30s - loss: 6.7379"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7740/7740 [==============================] - 0s 53us/sample - loss: 3.5574 - val_loss: 1.8536\n",
      "Epoch 2/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 1.3316 - val_loss: 0.9380\n",
      "Epoch 3/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.8573 - val_loss: 0.8545\n",
      "Epoch 4/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.7344 - val_loss: 0.9545\n",
      "Epoch 5/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.6943 - val_loss: 0.7248\n",
      "Epoch 6/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.6682 - val_loss: 0.7356\n",
      "Epoch 7/100\n",
      "7740/7740 [==============================] - 0s 31us/sample - loss: 0.6494 - val_loss: 0.9732\n",
      "Epoch 8/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.6408 - val_loss: 0.6175\n",
      "Epoch 9/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.6256 - val_loss: 0.5877\n",
      "Epoch 10/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.6149 - val_loss: 0.6164\n",
      "Epoch 11/100\n",
      "7740/7740 [==============================] - 0s 29us/sample - loss: 0.6058 - val_loss: 0.5851\n",
      "Epoch 12/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.5961 - val_loss: 0.7040\n",
      "Epoch 13/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.5905 - val_loss: 0.5594\n",
      "Epoch 14/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.5797 - val_loss: 0.8668\n",
      "Epoch 15/100\n",
      "7740/7740 [==============================] - 0s 30us/sample - loss: 0.5764 - val_loss: 0.9031\n",
      "<<2324 more lines>>\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2976 - val_loss: 0.3259\n",
      "Epoch 72/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2979 - val_loss: 0.3275\n",
      "Epoch 73/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2982 - val_loss: 0.3235\n",
      "Epoch 74/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2971 - val_loss: 0.2947\n",
      "Epoch 75/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2960 - val_loss: 0.3523\n",
      "Epoch 76/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2967 - val_loss: 0.3259\n",
      "Epoch 77/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2962 - val_loss: 0.3409\n",
      "Epoch 78/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2952 - val_loss: 0.2925\n",
      "Epoch 79/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2949 - val_loss: 0.3667\n",
      "Epoch 80/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2948 - val_loss: 0.2954\n",
      "Epoch 81/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2931 - val_loss: 0.3468\n",
      "Epoch 82/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2951 - val_loss: 0.3064\n",
      "Epoch 83/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2932 - val_loss: 0.3054\n",
      "Epoch 84/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2924 - val_loss: 0.3041\n",
      "Epoch 85/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2920 - val_loss: 0.3227\n",
      "Epoch 86/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2922 - val_loss: 0.2982\n",
      "Epoch 87/100\n",
      "11610/11610 [==============================] - 0s 31us/sample - loss: 0.2917 - val_loss: 0.3389\n",
      "Epoch 88/100\n",
      "11610/11610 [==============================] - 0s 30us/sample - loss: 0.2915 - val_loss: 0.3658\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "RandomizedSearchCV(cv=3, error_score='raise-deprecating',\n",
       "                   estimator=<tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor object at 0x7ff3841c6be0>,\n",
       "                   iid='warn', n_iter=10, n_jobs=None,\n",
       "                   param_distributions={'learning_rate': <scipy.stats._distn_infrastructure.rv_frozen object at 0x7ff384301f60>,\n",
       "                                        'n_hidden': [0, 1, 2, 3],\n",
       "                                        'n_neurons': array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,...\n",
       "       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,\n",
       "       35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,\n",
       "       52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,\n",
       "       69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n",
       "       86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])},\n",
       "                   pre_dispatch='2*n_jobs', random_state=None, refit=True,\n",
       "                   return_train_score=False, scoring=None, verbose=2)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.stats import reciprocal\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "\n",
    "param_distribs = {\n",
    "    \"n_hidden\": [0, 1, 2, 3],\n",
    "    \"n_neurons\": np.arange(1, 100),\n",
    "    \"learning_rate\": reciprocal(3e-4, 3e-2),\n",
    "}\n",
    "\n",
    "rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)\n",
    "rnd_search_cv.fit(X_train, y_train, epochs=100,\n",
    "                  validation_data=(X_valid, y_valid),\n",
    "                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'learning_rate': 0.0033625641252688094, 'n_hidden': 2, 'n_neurons': 42}"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.35952892616378346"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.wrappers.scikit_learn.KerasRegressor at 0x7ff384301518>"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.3065\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-0.30652404945026074"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.engine.sequential.Sequential at 0x7ff350924668>"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = rnd_search_cv.best_estimator_.model\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 15us/sample - loss: 0.3065\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.30652404945026074"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercise solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. to 9."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "See appendix A."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 10."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Exercise: Train a deep MLP on the MNIST dataset (you can load it using `keras.datasets.mnist.load_data()`. See if you can get over 98% precision. Try searching for the optimal learning rate by using the approach presented in this chapter (i.e., by growing the learning rate exponentially, plotting the loss, and finding the point where the loss shoots up). Try adding all the bells and whistles—save checkpoints, use early stopping, and plot learning curves using TensorBoard.*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's load the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [],
   "source": [
    "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.mnist.load_data()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Just like for the Fashion MNIST dataset, the MNIST training set contains 60,000 grayscale images, each 28x28 pixels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Each pixel intensity is also represented as a byte (0 to 255):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('uint8')"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's split the full training set into a validation set and a (smaller) training set. We also scale the pixel intensities down to the 0-1 range and convert them to floats, by dividing by 255, just like we did for Fashion MNIST:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_valid, X_train = X_train_full[:5000] / 255., X_train_full[5000:] / 255.\n",
    "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n",
    "X_test = X_test / 255."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot an image using Matplotlib's `imshow()` function, with a `'binary'`\n",
    " color map:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(X_train[0], cmap=\"binary\")\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The labels are the class IDs (represented as uint8), from 0 to 9. Conveniently, the class IDs correspond to the digits represented in the images, so we don't need a `class_names` array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([7, 3, 4, ..., 5, 6, 8], dtype=uint8)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The validation set contains 5,000 images, and the test set contains 10,000 images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 28, 28)"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10000, 28, 28)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at a sample of the images in the dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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o9eSLl26lCmikakWLlwIRNfW2bNnA/DZZ58B+RMRHT58ONdccw2A7wMR4dVXX035/pEjR9KuXTsAatasmZ5GmrR75JFHABg4cKAfgyjnnB+DDBs2LOlzG2+8MRdffHHSayeffDKvv/56qdtiA9FA5s+fD8CgQYN44oknAFiwYAEQXST0IFDTpk0DorD4wQcfDMAWW2yRruZWmH/++QeANm3aANENVG222WYAfPnll2y33Xbpb1wGWLVqFQMGDADgvvvu86+ff/75ANxxxx0AbLjhhulvXAbQgShEN1yAk046KVRzglm1ahUA119/PRAdK4sWLQIodC0BmDBhAhCfb1988UWhG04u0GNCB2D54N9//wXwA4NzzjnHv1acBx54AIALL7yQhg0bAtCvXz8gt86pH374wacoaDrPd99951MUunbtGqxt6aCDzoEDByb9G6JBJkCNGjX8dUPHJWvWrAHg0ksvZdNNNwXgjDPOAODXX38tU5tsat4YY4wxxgSRtojoY489BkRP57Vr1waipxCA/fff308V5br+/fsD+KkSEfHT7/oEUr9+fbbccsukr9Onkp9//tlHRDUBPRtpJPTMM88EkiOhxx13HABXXnklANtss02x3+v3338HoG7duuXeztCuuuqqpEgoQPfu3X3ZJhPL16gwQJ8+fQC49dZbgeSptYIOPvhg3n///aTX3njjDZYsWQLk1nTse++9F7oJaaezJFdddVWR72ncuDEXXXRR0mt6j1m9ejUzZswA4Nxzz/Wfz9aoqEaDn376aSCKeOq1Qs+byZMn501EVK8RGgndcMMNOfHEEwH8lPsee+zh3//MM88AcNNNNwEwZcoUVqxYkfQ913WPXheLiBpjjDHGmCDWOyL65JNPAvD5558DMHTo0BJ93V9//RX/0MrRj9WoWNWqValWrRoAu+22GxCPwgtGBrOdlkfQaEVi1KJJkyZA9BRfMP9Tc7patWrl80Wz2e233w4UXkhx/vnnc9tttwHRcbEuvXv39tH2a6+9FoBevXqVZ1ODuO666wB8XwBccMEFQBzxMPDCCy/4j08++eSALUk/zQvt06dPoWOievXqXHLJJQC0b98eiGZaADbZZBOf26X56VtssYW/LucCnWHRHMB8oJE/LcWTiubaP/TQQxx00EHr/J6aZ9y9e3cmT54MxBG1TKfjC5191MWeTZs25c477wTg0EMPBaIc4lmzZgHxvVbzJXOtJN6oUaOS/n3QQQfx+OOPF/n+jh07AlCnTh0gXs+RSBe3lVaJrzx6URs8eDAQJ66Whh4gasWKFT7Uq1MpOg0watSonJhy1TSEqVOnAvFNYcstt/SDTr2Z9O3bl6uvvjrpfZq6oNP4EK+ePueccyq6+eXq66+/9knwSqcD77rrrhLdECdNmgREK/r+/PPP8m9kIB999BEA99xzj39N6/3pubfBBjaRoQ/Cr7zyChANpNq2bRuySWmng8jEgcEuu+wCRA/yzZs3L/JrC6Yx7LTTTv7Gmwv++OOPpL9z3erVq/1xoPVSE2k61/PPPw/g0+MSHX300UBUk3jEiBH++wIsXryYpk2bln/DK8jKlSs566yzgDjYoefDsGHDClXW2Hbbbf09SH9PrVTz5ptvpqXN6aLnhAbBSvr/2qhRIyBKgWvWrFnS58oyHgSbmjfGGGOMMYGUOCL67LPPAvHIV6fQi3qKPvDAA4F44Ulx3nrrLR8a/vnnnwF49913gWi6TZOMs3maXp+uNJKnUdDEKXiNcD700EM+yqkR0dGjRwPJpZ2ytZ7oTTfdxPLlywGoUqUKAC+99BJAiacHdcr6jz/+8NGdkhxrmU7TCzTKe+yxx/qpJYuExnRWRf/eYIMNciqiVxK6eMA5R4sWLQAYN24ckHrh3t9//w1EizZ06lqvP3p9yWVbbbUVEEW/cs2kSZPo27dvys8dcMABvPzyy0DxC9E0Sjh06FC/mE13bMsWK1euBKLUJo2E6lhFy1npcVCQjnHmzJkDxLMGy5Yto3r16hXX6DTTVB1NE3z66ad9OatUNCXj8ssvB2Dp0qW+pKBG2st6b7I7mzHGGGOMCaLEEdG3334bwO8/qkm+5VHqo2XLlr5kguapaC7lu+++66OlvXv3LvPPCq1x48ZFfk6jE7vssovP4dGk6sToh0aGs7Wg/aeffuo/PuKIIwBo3bq1f03zkgrmEkNUjBhIKj/ToUMHABo0aFDeTU27r776KunfZ599NvXq1QvUmsyluW4mmiXR60NiJFRnr7744gsATjvtNCC6tmquuV5vc41eNxNpZGy//fZLd3MqjOZyaoQq0QEHHABE9+6Ce4PnKo383nzzzX42UWcJioqEqsQF1RBvqJJL0VDARz+nT58ORJvlaKkvLd80fvx4f0zpPXfZsmX+e+iM9f/93/8B+BnO0rKIqDHGGGOMCaLEEdGdd9456e/ypvv+6mpqLbAKcTQwFyKiavz48UAUndDIpuaRTps2ze8dPm/ePCBe4VanTh1ee+21dDe3wmhOj/rkk098rlNJVitutdVWvsJANhs7diwAv/32GxDn/x5zzDHB2pTJ5s6dG7oJGUVLqyTSSGiq8jM6E5FqhXUuSLXZRy7kkCuNUum1T/MaIc7b0+jg+kZDv//++6ToF8Cmm27q79GZaOHChQBcdtllQLRFpRao33rrrdf59XPnzuW5556ruAZmEI0Ua4nATp06+dJW+ndxG2Lss88+HH744UC8kr579+5lGp/lTuG4LKP1WB966KFCOys55/wAVD+n0/E9e/YsVHoi21xxxRV069YNiEP8//vf/4Boyn19SkGcffbZhUpJZKOCi0VOOOEEIPU+4cVZs2aNLWrKEzp1CPHgY/fddweiG0TBG6sOSHr27MmNN94IlKxWb67IpTQETUdKHIAqradb2rS5Bx980N9/VL169fwxlom03qkudt5jjz048sgji3y/pn8NGzYMiPZd//HHHyu0jZlCg2AlrUfdqlUrAL+b34477ljuqR52xzLGGGOMMUFkTET0/vvvB+JSAYk0EVYXuey1117pa1gFS4x4pfpYn0L16SXbo6EAv/zyi/9YdwPRyCjEiwm0zMScOXO4++67U36vXNn1omDh7VQFp1P58MMPAfw01OzZs30Zklq1apVjCzPHP//8U6isTHGLAHPVo48+CkCzZs38VKouHvjggw8KRdP1HDr77LPT2Mr0GzFihI+QqRo1alCpUqVALSpfzzzzjF/Mq6pXr87+++8PlD7yq2lBWkYwUVn3Ek+3WbNm+etgwbJuL730kt+5UY+TBg0acMUVVwDRQidY9+KmbDNmzBggLhGoC89Tcc7564Xu6FecxI12SsMiosYYY4wxJoi0RUR1ccHIkSNTltYobvGBPu1rHmHBp91sdMoppwAwc+ZMFixYAMQlq5YuXerfp7lcuRAJVWeccUahLQZVp06d/H7IGsEYNGhQoffpPslHHXVUBbUyff78809fHq0kli1b5mcFNDKYWOpKt+PV/Kdcs2zZskJ7iB9yyCGBWpN+Woxe88yLikbo67pIJ9cjoVp+59FHHy20CPLiiy/OmTJoP//8c6HSds2a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rVu3DtgiY7KDRgJffvllRo8eDcB7770HgEjhBavvvvsuAK1atUpL+yrSpEmTALjlllt4/vnnC33euWjBcZ06dQD8ew466KA0tdBkqilTpvh77JdffgnAypUr/d8aTd9oo43CNDBN7rjjDgBat27tZwzSMXNgEVFjjDHGGBNEhUdE9Sn0qaeeAuCGG27wEcBUdtllFwDefvttAOrWrUvlytkfuB07diwA7du3B2DVqlVAcpRC+0pEmDNnDgAXXHBB0vvPO++89DQ4IO0T/fuNN97I+Yjob7/9BsBrr70GxBHzb7/9lldffRWA3r17A95k9McAACAASURBVHDUUUex6667ArDxxhsDsOmmmwKwevVqHn/8cQCWLVsGQPfu3alSpUo6fg0TiB43V199NRBHdaDw+ZTouOOOA6KIUP369Su6meVq+fLlAJx22mkAvP766wD8/fff/j1HH300EEV1lixZAsDTTz8NQLt27QCYPXu2P49MfrnqqquAaHxSMK9YDRs2zL9v5513TlfTKpyOsQYPHsyUKVMAmDVrFgCbbbaZj/5uv/32AHz00UcV1pYKG+GtWbMGiKdXL7zwQv+5DTaIArHVq1cHokGWXlR0kKpT082aNeOtt94CokFpttJpoNWrVwPxTaFmzZrsvffeSe/dbbfdWLp0KQAjR44EYNSoUQCcddZZeTeo+Prrr/n3338BcvJ3Hz58ON26dQNSDxb0tdtvvx2Ip08AdthhBwA/+JwwYYK/aKpWrVrRvHnz8m+4Ceqff/4BouNBB6Cpjp/iLFq0CIB7772XW265pXwbWMF0IPn+++8D8UP6McccwwEHHADEU6mVKlXy9yS9Bj/33HNA9Ltfdtll6Wt4mug1c9asWdxwww1AfJ0ozoUXXsh1110HwOabbw6s/3GVyZYuXerTVu6//34AFi9eXOT7mzZtyiabbJKWtqXDwoULAbjkkkuA6P5akF4XAP766y8Af049+eSTNGjQoFzbZFPzxhhjjDEmCNHp4CKUejuphx56CIimBRNVrlzZP21pmYRffvnFP40PGTIEiKeiIYqKAnzwwQcA6/N0kjHba2mE86ijjgLi6O6dd97po7+pXH755QDcdtttQPT03qNHj9I2I2P6ozgaPddounPOP6HVrFmzPH9U0P749ddfAWjevDl//vln1KAUkQedGtGpo+KiE845//ktttgCiKZUGjZsWJImBd/ic8SIEQB8/PHHpf6BOrvy2GOP+dc0GlYKGXfO6DX75ptvBqBPnz5JaT1FvV8XPgL069cv6XMNGjTglVdeAfBpH0XImP7Qa4FGMxN/v+LoglFN9+nTp0+hWYT1kDH9oce4XieOPPJIAL7//vtSN0bTGE488cSSfknG9EdRevTowQMPPLDO99WrVw+I7kd6Hy6FjOkPnV198MEHAfjwww8LvUfPqc0335wVK1YAMG/evKT39OrVy8/OabR0s802K2kzbItPY4wxxhiTOSokR3T16tW+ZEhBV155pY+Eqvr163PvvfcCcRmRiy66CIC5c+f6HAZNQs/GfI0aNWoA8e+lEarioqGJX6deeOGFskRETQbRZHF9qoR48cj111/vX9PI5vz58/37Tz/9dABmzpxZ6PvWqlULiKMZJYyGZoSJEycC8Mgjj/jXiov2Jb6n4Of13zvttFN5NzMIXVCgs0b6dyLN3Wrbtq1fGHnwwQcnvef777/3EVE1c+ZMfvnlF2CdEdGMs74LSDQnX/Orc8VXX30FwB577FHoc5pbn3jvbNy4MRAXbte///rrL59He9NNNwFw6KGHrk/UKyPp+aOLP4ui45POnTsDubFA6cUXX6RLly5A8dfRF198EYjGYXPnzgXiBX/af+PHj/cLZ7Xk5COPPMLuu+9e6vZVyEB03rx5fnGNatq0KRAttimOTgHceeedAL4zckWHDh3K9PVFrewz2SdxekgX7ulNRFcAA/znP/8B4jqJL7/8csoBqNKHm2ysNKALsfr37+8rbfzxxx9A8RfQ+fPn+4UHSh/6brzxxopoalo554odgGrKz6BBgwDyYnGapn+lWmxRHL15Tp06tdzblG46YJw+fTqdOnVK+Z7ddtvNL1bSBV6paDpMv379/GDt888/B6I0ED22soWOQc4991wgXrylqTuJqlat6s8rrcKgi6qzmU7Hd+nShaLSME877bSUi9i0fmijRo0A+OKLL4AoteXTTz9Nem/btm2LvSetS/b3tDHGGGOMyUoVEhEdM2aM/3jDDTcE8IuRdOHFujz55JNAtC+w1lgcPnw4AJdeeimVKlUqt/ZmIk0kfuGFF5Jez7XppHymU6aTJk3yi9mKW3CRaoq6atWqQJTyAtF5plMob775JhBNq2ULjQxXr17d77BVEm+++aaPiOr0o5YnKZjekk0SSzSlioRCtFOQ1inOJyeffHKpvk4jY4kLYrONXi/OOeccIK7Tnej8888HogWv2223XZHfS+sN6+K3dU1dZ4OnnnrKp7AVV5pJ++Wyyy7zU9e5YOjQoUA8K5R4z9Ax2BNPPAGkTuVIpFPuWu6s4PeDqA62plOta9Y7FYuIGmOMMcaYIMo1Iqo7VyQW3Nbkec1hKin9uq5du/onNY36HHfccX4Hplyii7HGjh3rI2Na4F+jPAUXepnspQsB5s2bx7Bhw4CSFY7efvvt/VPspZdeCsTFhpcuXepLa+huO9kUES0tTbKHeDHKuhYCZgPNu+rTp0+hz2kBd42KmZIpOMuUjXTtRGIkVGcfdSZAj4/ioqGA32M9cSZT6QKl2rVrl7HF6fHyyy8DcOqpp5aoZJuW8qpTp06FtivdNDqZuMvYNttsA8Czzz4LUGgjnaLooq1rrrnGfx8t8zR9+nQgml3QKH1pWETUGGOMMcYEUa4RUc1nmjFjRrl9zyZNmhR6bciQIUlR12ykffTBBx/4fcXHjRsHJO8TrfTptmXLlmlqoUmXa6+9dr3y3Zo1a+ZXNBZHj6t8cN999/lo8kEHHRS4NeVHV3gnrnjVHC/NASxNuSX9fonfdx2bm2Q9LU+lsw+qRYsWAVpTesuXL+fYY49Neq1p06Z+5rCks496D9KoYKLDDz8ciKswZHofaeWEk046CSh+A4tjjjmGRx99FIhL46WiVUoSK/fsueeeQGbPtvz9998+DzqRzpyUNBKqNBqu5QAbNWrkI6GJlRp05X2vXr3Wu80Vtte80t0J8tkff/zBXnvtBcS76RTc97goOr162GGHVWALTUgNGjQot717v/32W/9xttWDLAsR8QPRXNgXW2vGaomixN9JS9yV9v+3f//+hfqodevWheqN5hotA6aLc4444ggADjnkkGBtKo1Ro0b5gYBOx/fr12+90t/Gjh3rp1wT9xVXmgaX6QNQpffRVKWZlNbDHDp0qF/kqQs6dRe/RDpATxyIan906dKFCy64AIhrtGaK7t2789lnnyW91q5duxLvPFZQtWrVADjhhBP8a3r8JdJFsqVhU/PGGGOMMSaIco2IavHURN26dSvPH5GVlixZUupirxq5yIXiuiVVcNow16cMy4NOI7366qvUrVsXiNM5cplOXSdauHAhEEUGIJqC1Kk7PZ/69u3rIxqZSKMxidOmWow8cdet9XHmmWcCyZslqEsuucRHPnLRxIkTC+0sc+uttwKZF9Fal8RolKZn6I5s63LFFVcA8PDDD6eMhALUrVuXZs2albGV6aWLlFLRxZpafui5557zi3nef//99fo5WtT9iy++oE2bNkC0YUAm0HRFLcsE8UK10aNHV8jPTLw3lyVdMn9GN8YYY4wxJqOUa0T0p59+Ks9vlzNq167tk3rnzJkDxPkqW221lX+fFu5/8MEH/VaemqujNIk8l6XK9dNtGjWKYSKaE3XMMccA0ROqHlO6NVs2+uuvv3z0QXP7NFk+0RtvvFHotXvvvbfQa61atQLiyJGWrMlUqSIYukiptJHLiRMnAnH+KcT9ks2LIOfNmwfASy+9BETRvoK5gtOnT2flypVAfF15/vnngaj0TLbkQha00047rfM9ixcv9uXNHn74YSA6v4ry1FNPZU25JqVlplLR2SIt+Thv3jxWrFiRlnal01dffQUk3zfXVay+NKZPn87VV19d6GeVRYUvVjLRzi66U1RJnHXWWYVqu2ky9aGHHppX0/RKKzKYiNbs7dq1KwALFiwAoguDPuRko08++QSIps7ffvttIPWOUsXRwVXigDRV9Y1MplOGiVNfd955Z6m+ly5u+v777wt9Tqd2N91001J971CWL1/OddddB8A999wD4AeaRdHrpi7w0f3XBw0a5Feh6wNd586d/YJSHcjMnj0biPszE+jAsm3btn4w9n//939APBX9ySeflGghiS7e2nfffSuiqRUq1V7pSgfdxQ2+RcSfA5qykG0pYbrzpIjQvHlzAF8doDzdf//9/Pjjj0mv1alTx1csKI38G9EYY4wxxpiMUGERUd0zun79+uX+vXNxV6VEtWrV8tNGumOO7iX93HPP0bFjx2BtM5lBd1RJ3FEIovIiGuXKRrrP9VtvveWnHTWCpf9OLGXWv39/ICqxoudFqn23s01ZS1EtW7bM1/PTa0ni99JdUhJLsmQDXXR21lln+ei5pqDotbJ169aFFslutdVWDBkyBIijv5rm88UXX/g+0r9//fVX/vzzTyCOKmnEJ3REdMcdd/Qfa/rKwQcf7HffK20ZHd1dSEsb5QO9VtaoUcOnIwwcOBAoPoK6xx57sOWWW1Z8A0upR48eQNl2xPr999+BOJWnX79+QLQzU8Hr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rqA7bQG+mHmuRkSvuOIKII78poqIfvHFFz66rMeNbhSRKzQSqmkZxS3GmjFjhl8cq6WtDjroICDesSybHXzwwb64eKqyTLp4Tc+bTz/9NKt3CVqXjTfe2P9+ukBLd3LcbLPNqFKlSqGv0euLRkTVI488woUXXliRza1wI0eO9IsW582bBxS/s1L79u19Ca9UJdBSpYuVhUVEjTHGGGNMEBYRTZPPPvsMKLyoonXr1r58k1q1apUvyKz7J6v27dsnLeLJFVq0/uGHH2b58uWFPq/bn2oURMvU5IOCkZ5rr702UEsqnuaFduzY0ed53XfffUW+XyOoDRs29AXbtbh7rituQc748eNZunQpkLtlm0rirbfeAqJthXUhnPbHhAkTgGjhqObPZRstvTNt2rSUeX4FP9ao6ejRo3N2xgCidQZ6D021IHZ9pLofZQs9rnv37s2CBQuAeK95ze88++yzGTBgABCV+oJoIZNuqZxqzUZ5CzoQ1enqadOmlflgyVapknyfeuqpQgNQtWbNmopuUlpNnDgRiKdh9WQpSGus6nSa1mHdYostfG3RfKErxXORPnA8/fTTfgpV/68Ta//pgFWPB4h27IJ416UpU6YA8R7T+WDhwoUAPPDAA/417aN8WuinAzRNbVq6dKnflU0X+unxlQsVF0499VR/P9XFWldffTUQLWTSQbcOzgYOHJjTA1Eo+wA0m2kNUE0zmDdvnn8Y0TFH4jVCdz9KHLhqupOeN/369auw9trUvDHGGGOMCSJoKEmnSvTvXLb55psDccRn1apVQBTh1OkjjYLqv1NZvHix3yFifXYuyFQ61V5UJLQgjaDqYp3bb7/d13vLJbpg6+OPP/avHXPMMUDxOw3lohNPPHG93q+RU12sk08RUa0dmljyS2cbNNqRuINOLhowYICv+zh79mz/upb80kUruUB3SBoxYkSR79liiy389TVxil6jxql2WTLZTafYNRVDRHx0dNtttwXi1JTEcmc6XT9x4kTuuuuupO9lEVFjjDHGGJNz0h4RrV27ti+onA+RUFWwgK5G9s4555z1+j7NmzfPiUio0ijfBx98ACSX7ymJF198MScjolp8fNasWf41Lb9RcHGbSa2oHYdykc6wvP7660BUhkWvs4n7zueS1q1bA3Heo+a8pZpReuqpp/y194ILLgDiUjVa3ieX6W43+veCBQv8TkwWEY3o7FwuePjhh4H4GD/11FN9CaqS7nykX5uOdSkWETXGGGOMMUGkPSLarFkzv6WlrvLLJyeddBIQR0RLSqNguq1frtCiw5q3stFGGyWtjoYob+Xkk09O+fWl2dc2k2kUb+7cuUBysWHdL9qklgv7QZeW5oHqtp4iktNlvhL16dMHiItspypXtfHGG/v3aeSratWqABxxxBHpaGa50nxfzelbF416at+ISE7NrJUHLWFUUKdOndLckvKj/9/nnHPOet8r9Ws32KDi45VBFivpia8D0dmzZ7P33nuHaErade7cGYAnnngCgI8++qjY9zdv3hyAyy+/HIhrgOWa+vXrA3DJJZcwaNCgpM81adKEE044IUSz0k5LDv3yyy9AdDHI5Z20ypMeI1q2Jl9Mnz6dV155BYhvHm3atKFnz54hm5U2Gtgozsknn8zff/8NxH2k6S/77bdfxTWuguhe3/o7rasUU//+/YF4V51zzz035x7iy2LChAmMHTs26bUuXboA8b0pm9SuXRuIAxmahrEuWrLpiSee8L93YpmnimJT88YYY4wxJoggEdHjjjsOwJcHuOmmm2jTpg0QT9VWqlQpRNMqnBYj191fFi5c6Bcyff3110C0l7hOq+nUSy7vC2yKp1F0U7xGjRoB8YLAOXPmhGxO2qQqq3LIIYf4UnH5QiOjqRadJO6Oo7NKHTp0SE/DKoBGMx955BEg2mWrqEVH/fv35+abbwbi3z3XS3hBHAXU0lY6E5uYkvDuu+8C0bGgKWF6jz7llFOA7NyZLDEFY33oIqcFCxb4MUeqvebLm0VEjTHGGGNMEEEiogcccAAAdevWBaKi3fo09+mnnyZ9Llfp4qNtt93W75FtUhszZozP59LcF2OKolEAjXYsWLAgJ/PhdAOMJ554wueCXXnllUCcU55PdBOIYcOG+YUnGglt3rw5Tz75JACbbLIJEC+QzEZ6PdRFr02aNPH3UD0WtJj5Lrvs4rd81O1e99xzz7S2NwTNbbz11lsBksr8aQkvXauxaNEi/zldo5Bq++1sceqppwLwxhtvADB48GC/d/xee+0FxBHj119/3efD6rEjItx+++0ANG7cuMLbG2QgWqVKFSBe4XnEEUf4i0OuD0BN8Q444AC/mnXFihVAlLKgF9J8G4h27do1L+oclietTau7Uj377LOcd955IZtUrrT+8uDBg4HopqED7R49egRrV2i629pVV13FVVddFbg1FUvrT+vgc+TIkX7gmTiYgGhAqmkI6Vh4kinee+89AP755x8gHoiOHj3aLwZVNWrU8Cku61vbOxPpbkl6XZgwYQJHH300ANtttx0Q72Y4c+bMQlP4HTp0KHFFhvJgU/PGGGOMMSYISaxTmEKxn8wC5Z1lbP2RrEL6Y9999wXiqTaIntqg3EtpZEV/pFFFZOWnvU90dyFdnHDIIYf410pREy/jjhGdlr3nnnv8a5MmTQLSMuWacf0RWND+0P3iBw4cWGRd7nbt2vl9xtMgY46Pbt26ATB8+PBCn9NZWa1P3atXr4oqk5cR/SEiPupZMGLunPOL2HRK/+qrr66odKaU/WERUWOMMcYYE0SQHFFjiqM7oLRr1y5wS0w2+u9//wtAx44dAXjmmWd44YUXgOwu2aM0F1I98MADebH4xBSmOaJaosjEdOZAFwbPmDEDiPpMZ920RFOuGzdunF+ENX78eCCOiHbv3t2X8wp1HbGIqDHGGGOMCcJyRNeP9Ucy649k1h+FWZ8ks/5IZv2RzPojmfVHspzsD4uIGmOMMcaYIGwgaowxxhhjgljX1LwxxhhjjDEVwiKixhhjjDEmCBuIGmOMMcaYIGwgaowxxhhjgrCBqDHGGGOMCcIGosYYY4wxJggbiBpjjDHGmCBsIGqMMcYYY4KwgagxxhhjjAkiyEBURBqIyKsi8qeI/CYi94pI5RBtyQQiMlJE5orIYhGZLiJnhW5TJhCRRiKyQkRGhm5LJrD+iNj1I5mILC3wZ7WI3BO6XSHZNbUwEekkIt+JyDIR+UFEWoZuU0h2PU0W8vgIFRG9H5gHbA20AFoBPQK1JRMMAho45zYB2gL9RWSvwG3KBPcBk0I3IoNYf0Ts+pHAOVdD/wB1geXAs4GbFZpdUxOIyKHAzUA3oCZwMPBj0EaFZ9fTtUIfH6EGog2BZ5xzK5xzvwHjgKaB2hKcc+4b59xK/efaPzsGbFJwItIJ+At4O3RbMoH1RxK7fhTtBKJB+oTQDQnJrqmF3ADc6Jz7yDm3xjk3xzk3J3SjQrHraSFBj49QA9HBQCcRqSYi9YAjiW4meUtE7heRv4GpwFzg1cBNCkZENgFuBHqHbksmsP4oxK4fResKPO6cc6EbEppdUyMiUgnYG9hSRGaIyOy16Swbh25bCHY9TZYJx0eogej7RBGMxcBsYDIwJlBbMoJzrgdRSLwlMBpYWfxX5LR+wKPOuVmhG5IhrD+S2fUjBRGpT5SmMDx0WzKBXVO9ukAVomh5S6J0lj2AviEbFZBdT5MFPz7SPhAVkQ2A14kuDNWBLYDNifIT8ppzbrVzbiKwLXBe6PaEICItgEOAO0O3JRNYfySz60exugATnXM/hW5IprBrKhDlDAPc45yb65xbANwBHBWwTUHY9TSl4MdHiJWmtYDtgHvX5vCsFJHHgP7A5QHak4kqk7/5TK2BBsAvIgJQA6gkIk2cc3sGbFcorbH+SGTXj6L9f3v3HRxV9f5x/L2g30RFBCWAKApWUFFRnAEGNaIIFlRUHBgVEHsFO4xSlG4XC/gTQWwgKpbB3kDEAqgUBQ0ZsSCooEYITcD9/bE+Z3eTZbNJdvfevfm8ZpzItpw9uXv33Oec8zy9gNFeN8Knauw5NRwO/xUKhVYQWSdb0xWi82kcPxwfWY+I/jfaXg5cGQqFdgiFQvWIrGtamO22+EEoFGr4X9qEOqFQqHYoFOoM9AQ+8LptHvk/Il8YR/7333jgdaCzl43ykPojhs4fiYVCofbAXmi3vM6piU0Crv2vb+oD/YEZHrfJCzqfJubp8eHVGtGzgS7AaqAY2Apc71FbvBYmMmW0AvgLuAfoHw6HX/W0VR4Jh8MbwuHwr/YfUApsCofDq71umxfUHwnp/FFeb2B6OBxe53VDfEDn1PKGEUlVVAQsBb4CRnjaIg/ofLpdnh4fIW2uFBEREREvqMSniIiIiHhCA1ERERER8YQGoiIiIiLiCQ1ERURERMQTFeURzfWdTKE0v576I576I576ozz1STz1Rzz1Rzz1Rzz1R7xA9ocioiIiIiLiCQ1ERURERMQTGoiKiIiIiCc0EBURERERT2ggKiIiIgD88MMPdO/ene7du9O4cWMaN27MwoULvW6WeGzZsmUsW7aM+++/nyZNmtCkSROaN29O8+bN6dmzZ7VeWwNREREREfFERembJMMmT57MSy+9BMCMGTMACIfDhEKJsz4MGjSISy65BICGDRsCkJeXl4WWVp29F/uZl5fHZ599BsARRxzhWbtERCTi66+/BqBLly6sXLkSiHwXAUydOlXn6hqmuLgYgMceewyAp59+GoDffvut3GM3bdrE6tWrASgoKKj071JEVEREREQ8EbIrnu3ISPLUE044AYCZM2e624YMGQLA0KFD0/mrfJtMdvLkyQAMHjyYFStWxP+SJBHR2PtefPFFALp165bqr/WkP2rVilzv1K5d29122mmnAfDKK6+kuUmV4tvjwyM5l9B+2rRpAIwaNYoFCxak/Lw+ffowadKkVB7qi2OkoKCAXr16AXDvvfemtUGV5Iv+ANi8eTMAX331FQAff/wxAHPmzHEzLr/++mu559m555577gGgRYsWVW0C+Kg/quqNN94AcDNtsX1m44NHHnmEq666KpWXy/n+SLOc6o9t27YB8MQTT3DTTTcBsG7dOgAaNGgAQLt27Tj66KMjjfnv+HjyySeZNWsWAPvuu2+yX5GwPzwZiG5vkBXrww8/BKCwsLBav6o6T04gbf0xb948ANq2betuO+igg4DE09VFRUUALFiwwPWfPW7WrFnsuuuuqfxaT/rj888/B+JD/F26dAFg+vTpAOy4445JX+Off/4BoH///kD0S+R///sfO+xQ5RUmvj0+/v77bwCaN2/OkUceCcAHH3yQ0nNtiq158+YA7LLLLqn+Wl8PRJcsWQJEjqMpU6YAsHbtWiB6fKQqFAq5gV0FA1JfHCMNGzZkzZo1AG7Affjhh6evVanzRX8ADBgwAIAxY8ZU6fl23pg3b577jFWBb/qjsiZMmADAwIEDAfjjjz8AaNSoEXfeeScQOb8CXHDBBXGBhCR81x+bNm0CoGvXrkAk+HPsscdW92VT5bv+SMQGoBdeeCEAU6ZMcX/7jh07AnD//fcDiS/cxo0bxwUXXABQ0VhElZVERERExD98EREtLCyMm6aP9eGHH1YnKurbq5GSkhIARowYwQEHHABAjx49ANhtt93KPd7C4x07duTLL78EoHv37kBkIXmKPO2PQYMGATB69Gh3m0U2+/Xrl/S5F110EQDPPPNM3O1Tp07lnHPOqUwzYvn2+LCryylTprhI+Zw5cwDYfffdt/u84uJi93ibVTj++ONT/bW+jojus88+AOWWslTXv//+m+xuXxwjsRHRzp07A/DCCy8AUKdOnTQ1LSW+6A+At956C4BTTjkFwEU127Zt66KdF198sXv8jTfeCJSfWZgyZYo791aBb/qjMmbMmOEihPZ9bFOq77//Pvvtt19VX9p3/TF8+HAg+v0zceJE932SjC1RuPvuu92SwRRn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Xw/atm1bPvvss7jbfvnlF1e68YorrkhPA33OdsHa+4711ltv0ahRo2w3yTcs2tmvXz8AHn/8cff5MbYuPSipz2x2zrIl2N//nHPOcXsZbObOMpNANLG9lbusCSx1VewxEaSSnsnMnz8fiKRRhEgkvGXLlgDMmDEDiJyTLUOPHTuWocX2raRT1gaisWmHElVXytUpe0vBY3+s8ePHu1q2t99+OwDt2rUrVxvdUhOtWrXKHRAWHp85c6Y7mey8884A3HDDDZl8GznDckra5oynnnrKTVP3798fiFwUjBo1Coh+IZnXXnstW01Ni40bN5argDF27FgKCgo8alH62HGfqIpUMjaVGCscDpf7WwfV2rVrgUiNeYB3333X3We31cRBqA0qpk6dyn333QfEb74w9v1z9913Z69xHrCKWieffLLLQZyool3Xrl0BXD36msA2rr355ptAJK1V48aNvWxSRu2+++60aNECiL73yy67DIgMyi1fuQUHLG0kQK9evQC49tprM9Y+Tc2LiIiIiCeyHhEtLCyMq7IEuTstD9CpUycguhj4008/5csvvwSgW7duADRo0KBcFPiFF14AEkeyifUKAAADkElEQVSDQqGQu92uWk4//fQMtN7fLLFwospDFlHu1KmT6yuLiL333nsueXWuV8cYM2aMi+rUr18fwNVErqliNxiYRo0auXQjQWf1sS3dTigUYv/99wei9bGDymZEnnnmGXebFYSw5Rq26SZWXl6eS3lm30U2JR0Uu+22GxDtI5NoBgGiG4gnTJiQ2YblgGbNmrnzaxDtsccebjawVatWQHzFpEmTJpV7jqV/GzZsGJDZwiC5/S0tIiIiIjkra5eEtjEpdoNSEJLc2xrOiRMnApEksGVLYP3xxx+8+OKLKb/meeed59Y91uSyfLau9rnnnnPlLW1BfmlpKRBZF2br4WIX4Fvy91yNeljEd9q0aS7ia+8pKKzcrdVAror8/HwAWrZsGeg1XhCNgI4bNw6In025/PLLgWAUOEjENuzZLFOiqGcsi261adMGiJTzzMQmCz+xDa5lv0/z8/M5//zzAahbty4Q2cAUm9JHgs9SQj799NNAZJxRliW2b9Omjdv0mY1UgaGyOcfKSHpnMjb9nmxjUham5Cu3C6JiFfbH77//7nbNv/766wBuqh7g6KOPjrzQf/3epEkTTj31VCBaPSmDuziz3h/pZjnQrEb92LFjeeedd4DEx1oFfNsfdky8/fbbbjfrwoULgeiUSQakuz8gSZ/YBVvXrl3d384uOEpKStxGwESDK9sNfeihhwKJ6yeniW+OEbvYtQsumyobOXKk28yYhaUonvRHKnXhrSJO3759GThwIBBZFpVhvjk+fCIn+mPJkiVA/PkjQ5WDcqI/sihhf2hqXkREREQ8kbGIqLFIh0VIhwwZEpfKKcN0NRJP/RHPd/2xfv16ADp06ADAokWL3LRaFjaiZDUimsjKlSuByHIM2wjoccUk3xwjVhvdliBYXj+L/mWJJ/1hS1Vsw9GPP/7opgxt857lBc1ylSTfHB8+kRP9oYioZxQRFRERERH/yHhE1GO6Gomn/ojnu/6wdZMWBdxpp52YPXs2AK1bt67uy1fE84ioD/nuGPGY+iOe+iNeTvSHzS706NEDiBSiydBmtpzojyxSRFRERERE/EMR0cpRf8RTf8RTf5SnPomn/oin/oin/oin/ogXyP5QRFREREREPKGBqIiIiIh4oqKpeRERERGRjFBEVEREREQ8oYGoiIiIiHhCA1ERERER8YQGoiIiIiLiCQ1ERURERMQTGoiKiIiIiCf+H/OYJgZ07XSgAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x345.6 with 40 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_rows = 4\n",
    "n_cols = 10\n",
    "plt.figure(figsize=(n_cols * 1.2, n_rows * 1.2))\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        index = n_cols * row + col\n",
    "        plt.subplot(n_rows, n_cols, index + 1)\n",
    "        plt.imshow(X_train[index], cmap=\"binary\", interpolation=\"nearest\")\n",
    "        plt.axis('off')\n",
    "        plt.title(y_train[index], fontsize=12)\n",
    "plt.subplots_adjust(wspace=0.2, hspace=0.5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build a simple dense network and find the optimal learning rate. We will need a callback to grow the learning rate at each iteration. It will also record the learning rate and the loss at each iteration:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "K = keras.backend\n",
    "\n",
    "class ExponentialLearningRate(keras.callbacks.Callback):\n",
    "    def __init__(self, factor):\n",
    "        self.factor = factor\n",
    "        self.rates = []\n",
    "        self.losses = []\n",
    "    def on_batch_end(self, batch, logs):\n",
    "        self.rates.append(K.get_value(self.model.optimizer.lr))\n",
    "        self.losses.append(logs[\"loss\"])\n",
    "        K.set_value(self.model.optimizer.lr, self.model.optimizer.lr * self.factor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, activation=\"relu\"),\n",
    "    keras.layers.Dense(100, activation=\"relu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will start with a small learning rate of 1e-3, and grow it by 0.5% at each iteration:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=keras.optimizers.SGD(lr=1e-3),\n",
    "              metrics=[\"accuracy\"])\n",
    "expon_lr = ExponentialLearningRate(factor=1.005)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's train the model for just 1 epoch:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "55000/55000 [==============================] - 3s 52us/sample - loss: 55143288500710.3281 - accuracy: 0.5734 - val_loss: 2.3660 - val_accuracy: 0.1100\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(X_train, y_train, epochs=1,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[expon_lr])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now plot the loss as a functionof the learning rate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Loss')"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(expon_lr.rates, expon_lr.losses)\n",
    "plt.gca().set_xscale('log')\n",
    "plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))\n",
    "plt.axis([min(expon_lr.rates), max(expon_lr.rates), 0, expon_lr.losses[0]])\n",
    "plt.xlabel(\"Learning rate\")\n",
    "plt.ylabel(\"Loss\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The loss starts shooting back up violently around 3e-1, so let's try using 2e-1 as our learning rate:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(300, activation=\"relu\"),\n",
    "    keras.layers.Dense(100, activation=\"relu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer=keras.optimizers.SGD(lr=2e-1),\n",
    "              metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'./my_mnist_logs/run_001'"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run_index = 1 # increment this at every run\n",
    "run_logdir = os.path.join(os.curdir, \"my_mnist_logs\", \"run_{:03d}\".format(run_index))\n",
    "run_logdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/100\n",
      "55000/55000 [==============================] - 3s 46us/sample - loss: 0.2361 - accuracy: 0.9280 - val_loss: 0.1183 - val_accuracy: 0.9664\n",
      "Epoch 2/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0954 - accuracy: 0.9705 - val_loss: 0.0855 - val_accuracy: 0.9768\n",
      "Epoch 3/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0642 - accuracy: 0.9796 - val_loss: 0.0822 - val_accuracy: 0.9786\n",
      "Epoch 4/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0462 - accuracy: 0.9855 - val_loss: 0.0804 - val_accuracy: 0.9770\n",
      "Epoch 5/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0333 - accuracy: 0.9894 - val_loss: 0.1907 - val_accuracy: 0.9500\n",
      "Epoch 6/100\n",
      "55000/55000 [==============================] - 2s 41us/sample - loss: 0.0244 - accuracy: 0.9919 - val_loss: 0.0698 - val_accuracy: 0.9828\n",
      "Epoch 7/100\n",
      "55000/55000 [==============================] - 2s 41us/sample - loss: 0.0205 - accuracy: 0.9929 - val_loss: 0.0809 - val_accuracy: 0.9800\n",
      "Epoch 8/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0153 - accuracy: 0.9949 - val_loss: 0.0841 - val_accuracy: 0.9824\n",
      "Epoch 9/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0084 - accuracy: 0.9975 - val_loss: 0.0899 - val_accuracy: 0.9788\n",
      "Epoch 10/100\n",
      "55000/55000 [==============================] - 2s 41us/sample - loss: 0.0084 - accuracy: 0.9972 - val_loss: 0.0741 - val_accuracy: 0.9844\n",
      "Epoch 11/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 0.0042 - accuracy: 0.9989 - val_loss: 0.0729 - val_accuracy: 0.9842\n",
      "Epoch 12/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 0.0028 - accuracy: 0.9993 - val_loss: 0.0839 - val_accuracy: 0.9838\n",
      "Epoch 13/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 0.0018 - accuracy: 0.9997 - val_loss: 0.0747 - val_accuracy: 0.9858\n",
      "Epoch 14/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 8.9780e-04 - accuracy: 0.9998 - val_loss: 0.0732 - val_accuracy: 0.9858\n",
      "Epoch 15/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 3.7406e-04 - accuracy: 1.0000 - val_loss: 0.0771 - val_accuracy: 0.9862\n",
      "Epoch 16/100\n",
      "55000/55000 [==============================] - 2s 41us/sample - loss: 2.2128e-04 - accuracy: 1.0000 - val_loss: 0.0783 - val_accuracy: 0.9860\n",
      "Epoch 17/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 1.8240e-04 - accuracy: 1.0000 - val_loss: 0.0789 - val_accuracy: 0.9864\n",
      "Epoch 18/100\n",
      "55000/55000 [==============================] - 2s 45us/sample - loss: 1.5978e-04 - accuracy: 1.0000 - val_loss: 0.0800 - val_accuracy: 0.9862\n",
      "Epoch 19/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 1.4287e-04 - accuracy: 1.0000 - val_loss: 0.0808 - val_accuracy: 0.9862\n",
      "Epoch 20/100\n",
      "55000/55000 [==============================] - 2s 42us/sample - loss: 1.2992e-04 - accuracy: 1.0000 - val_loss: 0.0812 - val_accuracy: 0.9860\n",
      "Epoch 21/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 1.2116e-04 - accuracy: 1.0000 - val_loss: 0.0816 - val_accuracy: 0.9860\n",
      "Epoch 22/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 1.1251e-04 - accuracy: 1.0000 - val_loss: 0.0820 - val_accuracy: 0.9862\n",
      "Epoch 23/100\n",
      "55000/55000 [==============================] - 2s 44us/sample - loss: 1.0464e-04 - accuracy: 1.0000 - val_loss: 0.0826 - val_accuracy: 0.9866\n",
      "Epoch 24/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 9.8997e-05 - accuracy: 1.0000 - val_loss: 0.0833 - val_accuracy: 0.9864\n",
      "Epoch 25/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 9.3607e-05 - accuracy: 1.0000 - val_loss: 0.0837 - val_accuracy: 0.9864\n",
      "Epoch 26/100\n",
      "55000/55000 [==============================] - 2s 43us/sample - loss: 8.8776e-05 - accuracy: 1.0000 - val_loss: 0.0839 - val_accuracy: 0.9864\n"
     ]
    }
   ],
   "source": [
    "early_stopping_cb = keras.callbacks.EarlyStopping(patience=20)\n",
    "checkpoint_cb = keras.callbacks.ModelCheckpoint(\"my_mnist_model.h5\", save_best_only=True)\n",
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)\n",
    "\n",
    "history = model.fit(X_train, y_train, epochs=100,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[early_stopping_cb, checkpoint_cb, tensorboard_cb])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 0s 26us/sample - loss: 0.0692 - accuracy: 0.9806\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.06917384602149541, 0.9806]"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = keras.models.load_model(\"my_mnist_model.h5\") # rollback to best model\n",
    "model.evaluate(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We got over 98% accuracy. Finally, let's look at the learning curves using TensorBoard:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "      <iframe id=\"tensorboard-frame-c70eacbf9e1fb8d3\" width=\"100%\" height=\"800\" frameborder=\"0\">\n",
       "      </iframe>\n",
       "      <script>\n",
       "        (function() {\n",
       "          const frame = document.getElementById(\"tensorboard-frame-c70eacbf9e1fb8d3\");\n",
       "          const url = new URL(\"/\", window.location);\n",
       "          url.port = 6006;\n",
       "          frame.src = url;\n",
       "        })();\n",
       "      </script>\n",
       "  "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%tensorboard --logdir=./my_mnist_logs --port=6006"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "nav_menu": {
   "height": "264px",
   "width": "369px"
  },
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
